libffi库作用

libffi 库的作用

  • 1.libffi(Library for Foreign Function Interface)是一个为 C 程序提供 调用任意语言函数 的接口库。它的核心用途是在运行时动态创建调用栈,从而调用其它语言的函数或调用动态生成的代码片段。

  • 2.它在云原生、Python、JVM、数据库驱动、高性能框架中被广泛用作 跨语言调用的底层基础

      • Python 的 ctypes 和 cffi 模块依赖 libffi
      • LuaJIT、Ruby FFI、PHP FFI、OpenJDK、LLVM 等依赖 libffi
      • 与动态库交互时无需编译期绑定,适合插件式架构与 JIT(即时编译技术)

在 CentOS 8 上安装 libffi

1.安装系统运行时依赖

1
sudo dnf install libffi

2.安装开发头文件(用于编译 Python、Ruby 等源码时必备)

1
sudo dnf install libffi-devel

3.验证安装

1
rpm -qa | grep libffi

4.动态链接库检查

1
ldconfig -p | grep libffi

构建源码安装

当需要更新 libffi 或构建 Python 时可以手工编译:

1
2
3
4
5
6
wget https://github.com/libffi/libffi/releases/download/v3.4.6/libffi-3.4.6.tar.gz
tar -xvf libffi-3.4.6.tar.gz
cd libffi-3.4.6
./configure --prefix=/usr/local
make && sudo make install
sudo ldconfig

libffi 在 Python 中的应用示例

下面演示 Python 通过 ctypes 使用 libffi 调用 libc 的 printf

1
2
3
4
from ctypes import cdll, c_char_p

libc = cdll.LoadLibrary("libc.so.6")
libc.printf(c_char_p(b"hello libffi from ctypes!\n"))

libffi 在编译与运行时工具链中的定位

  • libffi 不属于编译器本身(如 GCC、Clang),也不是链接器(如 ld)。它更接近运行时阶段(Runtime),扮演 动态调用外部函数的桥梁
  • 它与 Python/Ruby/JVM、JIT 编译器、动态插件系统、eBPF 等共同处于 动态调用与即时执行层,用于在运行时构造调用栈并调用非本语言函数或动态生成的代码。

工具链架构定位图

从源码编译到运行时调用的整体工具链定位图:

flowchart LR
    A[源代码
C/Python/Ruby/Java etc.] --> B[编译器
GCC/Clang] B --> C[链接器
ld/gold/lld] C --> D[可执行文件/动态库
ELF / SO] D --> E[运行时系统
VM/解释器/JIT] subgraph Runtime Layer E --> F[libffi
动态构造调用栈] F --> G[通过 ABI 调用底层函数] end G --> H[OS/CPU 指令
系统调用/硬件执行]

libffi与动态语言生态的定位

在动态解释型语言的运行时结构中,libffi 为解释器/JIT 与动态库或系统函数提供底层调用接口

graph TB
    subgraph 解释与执行层
        A1[Python/Ruby/Lua VM] --> B1[JIT/解释器]
    end
    B1 --> C1[libffi
FFI调用接口] C1 --> D1[系统库/第三方动态库
libc.so, libm.so, custom.so] D1 --> E1[OS/CPU Execution]

总结定位

  • libffi 的定位不是“编译期工具”,而是运行时工具链组件
  • 能让编写语言与底层系统库通过 无须提前编译绑定 的方式进行跨语言调用,它属于 动态调用与跨语言互操作层核心基础库