ABI描述應用程式與OS之間的底層接口,允許編譯好的目标代碼在使用相容ABI的系統中無需改動就可以運作。
ABI涵蓋了各種細節,如:資料類型的大小、布局和對齊;調用約定(控制着函數的參數如何傳送以及如何接受傳回值),例如,是所有的參數都通過棧傳遞,還是部分參數通過寄存器傳遞;哪個寄存器用于哪個函數參數;通過棧傳遞的第一個函數參數是最先push到棧上還是最後;系統調用的編碼和一個應用如何向作業系統進行系統調用;以及在一個完整的作業系統ABI中,目标檔案的二進制格式、程式庫等等。
一個完整的ABI,像Intel二進制相容标準(iBCS),允許支援它的作業系統上的程式不經修改在其他支援此ABI的作業系統上運作。其他的ABI标準化了一些細節,包括C++ 名稱修飾,和同一個平台上的編譯器之間的調用約定,但是不包括跨平台的相容性。
ABI不同于應用程式接口(API),API定義了源代碼和庫之間的接口,是以同樣的代碼可以在支援這個API的任何系統中編譯,然而ABI允許編譯好的目标代碼在使用相容ABI的系統中無需改動就能運作。(ABI掩蓋了各種細節,例如:調用約定控制着函數的參數如何傳送以及如何接受傳回值;系統調用的編碼和一個應用如何向作業系統進行系統調用;以及在一個完整的作業系統ABI中,對象檔案的二進制格式、程式庫等等)。 在Unix風格的作業系統中,存在很多運作在同一硬體平台上互相相關但是不相容的作業系統(尤其是Intel 80386相容系統)。有一些努力嘗試标準化ABI,以減少銷售商将程式移植到其他系統時所需的工作。然而,直到現在還沒有很成功的例子,雖然Linux标準化工作組正在為Linux做這方面的努力。
嵌入式應用二進制接口指定了檔案格式、資料類型、寄存器使用、堆積組織優化和在一個嵌入式軟體中的參數的标準約定。開發者使用自己的彙編語言也可以使用EABI作為與相容的編譯器生成的彙編語言的接口。 支援EABI的編譯器建立的目标檔案可以和使用類似編譯器産生的代碼相容,這樣允許開發者連結一個由不同編譯器産生的庫。EABI與關于通用計算機的ABI的主要差別是應用程式代碼中允許使用特權指令,不需要動态連結(有時是禁止的),和更緊湊的堆棧幀組織用來節省記憶體。廣泛使用EABI的有Power PC和ARM.
資料來源
• Matz, Michael, et al. "System v application binary interface." AMD64 Architecture Processor Supplement, Draft v0 99 (2013).