ABI (Application binary interface)
ABI (Application binary interface)
在电脑软件中,一个应用二进制接口 (ABI
) 是两个二进制程序模组之间的接口。通常,模组中的一个是库或操作系统服务,另一个为用户运行的程序。
一个 ABI
定义了数据接口或计算机程序是如何在机器码中被访问到的,这里说的机器码是一个底层、依赖于硬件的格式。而 API
则正好相反,它定义了源码形式的访问,这种方式是相对上层、独立于硬件,且通常是可读性较高的格式。ABI
的一个方面是调用规范,它确定了数据是如何作为输入提供给计算程序,或如何作为输出从计算程序中输出出来的。
与 ABI
关系紧密的通常是编译器、操作系统或库作者。一个应用程序员在写混杂多种编程语言的程序时或在使用不同编译器编译同一语言写的程序时,通常需要直接处理 ABI
,
描述
ABI
涉及的内容包括:
- 处理器指令集,像是寄存器文件结构体、栈组织、内存访问类型等
- 处理器可以直接访问的基础数据类型的长度、布局与对齐方式
- 调用规范控制着函数的参数是如何进行传递的,返回值是如何返回的,比如它控制着下面的行为:
- 是否将所有的参数传递给栈,还是部分参数通过寄存器进行传递
- 哪个函数参数使用哪个寄存器
- 传递给栈的第一个函数参数是第一个入栈还是最后一个入栈
- 一个应用应该如何通过系统调用访问到操作系统,是否
ABI
直接指定了系统调用,而不是访问系统调用的伪替 (自造词,原词 stub),系统调用号 - 在完整的操作系统中的
ABI
,目标文件、程序库的二进制格式等
完备 ABI
一个完备的 ABI
,比如 Intel Binary Compatibility Standard (iBCS)
,允许一个支持该操作系统 ABI
的程序,不做任何修改直接在另一个相同的系统 (提供必要的共享库,并满必要的预置条件) 上运行。
嵌入式 ABI
一个嵌入式应用二进制接口 (EABI:
Embedded-application binary interface) 指定了文件格式、数据类型、寄存器使用、栈组织以及函数参数传递等内容的标准规范。
支持 EABI
的编译器创建的目标码,兼容其他这种编译器生成的目标码。允许开发者将一个编译器生成的目标码,链接到另一个编译器生成的库。
EABI
设计来在嵌入式系统有限的资源上优化它的性能。因此 EABI
忽略大部分的内核与用户代码之间的抽象层概念。比如,可能会被避免动态链接,以允许更小的执行与更快的加载速度,固定的寄存器使用以允许更加紧凑的栈与内核调用,且将应用运行在特权模式下允许直接访问到定制化硬件操作,而不需要间接调用设备驱动。对 EABI
的选择,会影响性能。
被大家广泛使用的 EABI
包括 PowerPC
、Arm EABI
、MIPS EABI
。特定的软件,比如 C
库的实现,可能会增加额外的限制,以实现更加紧凑的 ABI
,比如 GNU OABI
以及 EABI for ARM
都是 ARM EABI
的一个子集。