应用二进制接口

在軟體開發中，应用二进制接口（，縮寫為ABI）是指兩程式模組間的接口；通常其中一個程式模組會是函式庫或作業系統所提供的服務，而另一邊的模組則是使用者所執行的程式。

一個ABI定義了機器碼如何存取資料結構與運算程序，此處所定義的界面相當低階並且相依於硬體。而類似概念的API則在原始碼定義這些，則較為高階，並不直接相依於硬體，通常會是人類可閱讀的程式碼。一個ABI常見的樣貌即是調用約定：資料怎麼成為計算程序的輸入或者從中得到輸出；x86的調用約定即是一個ABI的例子。

決定要不要採取既定的ABI（不論是否由官方提供），通常由編譯器，作業系統或函式庫的開發者來決定；然而，如果撰寫一個混和多個程式語言的應用程式，就必須直接處理ABI，採用來達成此目的。

描述
ABI涵盖了各种细节，如：
 数据类型的大小、布局和对齐;
 调用约定（控制着函数的参数如何传送以及如何接受返回值），例如，是所有的参数都通过栈传递，还是部分参数通过寄存器传递；哪个寄存器用于哪个函数参数；通过栈传递的第一个函数参数是最先push到栈上还是最后；
 系统调用的编码和一个应用如何向操作系统进行系统调用；
 以及在一个完整的操作系统ABI中，目标文件的二进制格式、程序库等等。

一个完整的ABI，像（iBCS），允许支持它的操作系统上的程序不经修改在其他支持此ABI的操作系统上运行。

其他的ABI标准化了一些细节，包括C++名字修饰Itanium C++ ABI  (compatible with multiple architectures),和同一个平台上的编译器之间的调用约定Itanium C++ ABI: Exception Handling  (compatible with multiple architectures)，但是不包括跨平台的兼容性。

ABI不同于应用编程接口（API），API定义了源代码和库之间的接口，因此同样的代码可以在支持这个API的任何系统中编译，然而ABI允许编译好的目标代码在使用兼容ABI的系统中无需改动就能运行。
在Unix风格的操作系统中，存在很多运行在同一硬件平台上互相相关但是不兼容的操作系统（尤其是Intel 80386兼容系统）。有一些努力尝试标准化ABI，以减少销售商将程序移植到其他系统时所需的工作。然而，直到现在还没有很成功的例子，虽然Linux标准化工作组正在为Linux做这方面的努力。

EABI
嵌入式应用二进制接口指定了文件格式、数据类型、寄存器使用、堆积组织优化和在一个嵌入式软件中的参数的标准约定。开发者使用自己的汇编语言也可以使用EABI作为与兼容的编译器生成的汇编语言的接口。
支持EABI的编译器创建的目标文件可以和使用类似编译器产生的代码兼容，这样允许开发者链接一个由不同编译器产生的库。EABI与关于通用计算机的ABI的主要区别是应用程序代码中允许使用特权指令，不需要动态链接（有时是禁止的），和更紧凑的堆栈帧组织用来节省内存。
广泛使用EABI的有Power PC"PowerPC Embedded Processors Application Note"和ARM.

参见

 应用编程接口 （API）
 二进制代码的兼容性
 程序设计
 系统调用

参考资料

外部链接
 KDE Techbase Policies  - Good compendium of development rules of thumb (with some examples ) for not breaking binary compatibility between releases of your library.
 Mac OS X ABI Function Call Guide 
 Debian ARM EABI port 
 µClib: Motorola 8/16-bit embedded ABI 
 AMD64 (x86-64) Application Binary Interface
 Application Binary Interface (ABI) for the ARM Architecture 
 MIPS EABI documentation
 Sun Studio 10 Compilers and the AMD64 ABI  - Good summary and comparison about some popular ABIs
 "M·CORE Applications Binary Interface Standards Manual"  for the Freescale M·CORE processors

Category:操作系统技术
Category:应用程序接口