應用二進制介面
在軟件開發中,應用二進制介面(英語: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