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 | wget https://github.com/libffi/libffi/releases/download/v3.4.6/libffi-3.4.6.tar.gz |
libffi 在 Python 中的应用示例
下面演示 Python 通过 ctypes 使用 libffi 调用 libc 的 printf:
1 | from ctypes import cdll, c_char_p |
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 的定位不是“编译期工具”,而是运行时工具链组件;
- 能让编写语言与底层系统库通过 无须提前编译绑定 的方式进行跨语言调用,它属于 动态调用与跨语言互操作层核心基础库。