ABI(Application Binary Interface)
Definition
ABI(Application Binary Interface,应用程序二进制接口)定义了已编译程序之间进行交互时的二进制级约定。
它规定:
- 二进制代码如何调用其他代码
- 数据如何表示
- 函数如何传递参数
- 程序如何链接和加载
简单理解:
API 解决“源码如何调用”,ABI 解决“机器码如何交互”。
ABI 与 API 的区别
API
API(Application Programming Interface)面向程序员。
例如:
printf("hello");关注:
- 函数名称
- 参数类型
- 返回值
属于源码层面的接口。
ABI
ABI 面向编译后的程序。
例如:
flowchart TD ProgA["Program A"] -->|ABI| ProgB["Program B"]
关注:
- 参数放寄存器还是栈
- 返回值位置
- 数据结构内存布局
- 符号名称规则
属于二进制层面的接口。
ABI 包含的内容
1. Calling Convention(调用约定)
规定函数调用方式。
例如:
函数:
int add(int a, int b);需要约定:
参数:
a 放哪里?
b 放哪里?
返回值:
放哪个寄存器?
栈:
谁负责清理?
2. Data Layout(数据布局)
规定数据在内存中的表示。
例如:
结构体:
struct User {
int id;
char name[32];
};需要约定:
- 字段顺序
- 对齐方式
- 大小
否则不同语言无法正确访问。
3. Symbol Naming(符号规则)
规定编译后的函数名称。
例如:
源码:
void hello();可能生成:
hello
而 C++:
void hello(int);可能生成:
_Z5helloi
因为需要支持函数重载。
4. Binary Format(二进制格式)
规定可执行文件和库的结构。
例如:
- ELF
- PE
- Mach-O
用于:
- 加载
- 链接
- 动态库调用
ABI 的作用
1. 支持模块组合
例如:
flowchart TD LibA["Library A"] -->|ABI| AppB["Application B"]
不同模块可以独立编译。
2. 支持跨语言调用
例如:
flowchart TD Rust["Rust"] -->|C ABI| CLib["C Library"]
flowchart TD Py["Python"] -->|C ABI| Native["Native Extension"]
3. 保持二进制兼容
如果 ABI 不变:
旧程序可以继续运行。
例如:
操作系统保持 ABI:
flowchart TD App["Application"] -->|System ABI| OS["Operating System"]
应用无需重新编译。
为什么 C ABI 很常见?
C ABI 成为事实标准主要因为:
1. C 语言模型简单
C:
- 类型系统简单
- 数据布局直接
- 调用规则清晰
容易被其他语言实现。
2. Runtime 较小
C 通常依赖:
- 操作系统
- 标准库
没有复杂语言 Runtime。
3. 工具链支持广泛
几乎所有主流语言都可以:
extern "C"
调用 C 接口。
ABI 与 Runtime 的关系
两者处于不同层次。
Runtime:
flowchart TD Prog["Program"] --> Env["Execution Environment"]
负责:
- 内存管理
- 调度
- GC
- 异常处理
ABI:
flowchart TD Bin["Binary"] --> IF["Binary Interface"]
负责:
- 调用规则
- 数据交换
- 链接
关系:
flowchart TD App["Application"] --> Runtime["Runtime"] Runtime -->|ABI| OS["OS / Hardware"]
ABI 与 Interface 的关系
ABI 是 Interface 的一种。
关系:
flowchart TD IF["Interface"] --> API["API"] IF --> ABI["ABI"] IF --> HW["Hardware Interface"] IF --> Protocol["Protocol Interface"]
ABI 特点:
- 面向二进制
- 面向编译后程序
- 面向系统兼容
Summary
ABI:
定义二进制程序之间交互规则的接口标准,使不同模块、不同语言、不同编译产物能够协同运行。
核心关键词:
- Binary Interface
- Calling Convention
- Data Layout
- Linking
- Compatibility
- Cross-language Interoperability