應用二進制接口
在軟體開發中,應用二進制接口(英語:application binary interface,縮寫為ABI)是指兩程式模組間的接口;通常其中一個程式模組會是函式庫或作業系統所提供的服務,而另一邊的模組則是使用者所執行的程式。
一個ABI定義了機器碼如何存取資料結構與運算程序,此處所定義的界面相當低階並且相依於硬體。而類似概念的API則在原始碼定義這些,則較為高階,並不直接相依於硬體,通常會是人類可閱讀的程式碼。一個ABI常見的樣貌即是調用約定:資料怎麼成為計算程序的輸入或者從中得到輸出;x86的調用約定即是一個ABI的例子。
決定要不要採取既定的ABI(不論是否由官方提供),通常由編譯器,作業系統或函式庫的開發者來決定;然而,如果撰寫一個混和多個程式語言的應用程式,就必須直接處理ABI,採用外部函式呼叫來達成此目的。
描述
[編輯]ABI涵蓋了各種細節,如:
- 數據類型的大小、布局和對齊;
- 調用約定(控制着函數的參數如何傳送以及如何接受返回值),例如,是所有的參數都通過棧傳遞,還是部分參數通過寄存器傳遞;哪個寄存器用於哪個函數參數;通過棧傳遞的第一個函數參數是最先push到棧上還是最後;
- 系統調用的編碼和一個應用如何向操作系統進行系統調用;
- 以及在一個完整的操作系統ABI中,目標文件的二進制格式、程序庫等等。
一個完整的ABI,像Intel二進制兼容標準(iBCS)[1],允許支持它的操作系統上的程序不經修改在其他支持此ABI的操作系統上運行。
其他的ABI標準化了一些細節,包括C++名字修飾[2] ,和同一個平台上的編譯器之間的調用約定[3],但是不包括跨平台的兼容性。
ABI不同於應用程序接口(API),API定義了源代碼和庫之間的接口,因此同樣的代碼可以在支持這個API的任何系統中編譯,然而ABI允許編譯好的目標代碼在使用兼容ABI的系統中無需改動就能運行。 在Unix風格的操作系統中,存在很多運行在同一硬件平台上互相相關但是不兼容的操作系統(尤其是Intel 80386兼容系統)。有一些努力嘗試標準化ABI,以減少銷售商將程序移植到其他系統時所需的工作。然而,直到現在還沒有很成功的例子,雖然Linux標準化工作組正在為Linux做這方面的努力。
EABI
[編輯]嵌入式應用二進制接口指定了文件格式、數據類型、寄存器使用、堆積組織優化和在一個嵌入式軟件中的參數的標準約定。開發者使用自己的匯編語言也可以使用EABI作為與兼容的編譯器生成的匯編語言的接口。 支持EABI的編譯器創建的目標文件可以和使用類似編譯器產生的代碼兼容,這樣允許開發者鏈接一個由不同編譯器產生的庫。EABI與關於通用計算機的ABI的主要區別是應用程序代碼中允許使用特權指令,不需要動態鏈接(有時是禁止的),和更緊湊的堆棧幀組織用來節省內存。[4] 廣泛使用EABI的有Power PC[5]和ARM.[6][7]
參見
[編輯]參考資料
[編輯]- ^ Intel Binary Compatibility Standard (iBCS). [2011-01-19]. (原始內容存檔於2012-05-27).
- ^ Itanium C++ ABI 網際網路檔案館的存檔,存檔日期2008-11-19. (compatible with multiple architectures)
- ^ Itanium C++ ABI: Exception Handling 網際網路檔案館的存檔,存檔日期2008-05-11. (compatible with multiple architectures)
- ^ EABI Summary. PowerPC Embedded Application Binary Interface: 32-Bit Implementation (PDF) Version 1.0. Freescale Semiconductor, Inc. 1995-10-01: 28–30 [2011-01-19]. (原始內容存檔 (PDF)於2012-03-16).
- ^ "PowerPC Embedded Processors Application Note"[永久失效連結]
- ^ Debian ARM accelerates via EABI port. Linuxdevices.com. 2007-01-19 [2007-10-11]. (原始內容存檔於2012-07-14).
- ^ Andrés Calderón and Nelson Castillo. Why ARM's EABI matters. Linuxdevices.com. 2007-03-14 [2007-10-11]. (原始內容存檔於2012-07-14).
外部連結
[編輯]- 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