應用二進制接口

在軟體開發中,應用二進制接口(英語:application binary interface,縮寫為ABI)是指兩程式模組間的接口;通常其中一個程式模組會是函式庫或作業系統所提供的服務,而另一邊的模組則是使用者所執行的程式。

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

決定要不要採取既定的ABI(不論是否由官方提供),通常由編譯器,作業系統或函式庫的開發者來決定;然而,如果撰寫一個混和多個程式語言的應用程式,就必須直接處理ABI,採用外部函式呼叫英語Foreign function interface來達成此目的。

描述

ABI涵蓋了各種細節,如:

  • 數據類型的大小、布局和對齊;
  • 調用約定(控制着函數的參數如何傳送以及如何接受返回值),例如,是所有的參數都通過棧傳遞,還是部分參數通過寄存器傳遞;哪個寄存器用於哪個函數參數;通過棧傳遞的第一個函數參數是最先push到棧上還是最後;
  • 系統調用的編碼和一個應用如何向操作系統進行系統調用;
  • 以及在一個完整的操作系統ABI中,目標文件的二進制格式、程序庫等等。

一個完整的ABI,像Intel二進制兼容標準英語Intel Binary Compatibility Standard(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]

參見

參考資料

  1. ^ Intel Binary Compatibility Standard (iBCS). [2011-01-19]. (原始內容存檔於2012-05-27). 
  2. ^ Itanium C++ ABI 網際網路檔案館存檔,存檔日期2008-11-19. (compatible with multiple architectures)
  3. ^ Itanium C++ ABI: Exception Handling 網際網路檔案館存檔,存檔日期2008-05-11. (compatible with multiple architectures)
  4. ^ 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). 
  5. ^ "PowerPC Embedded Processors Application Note"[永久失效連結]
  6. ^ Debian ARM accelerates via EABI port. Linuxdevices.com. 2007-01-19 [2007-10-11]. (原始內容存檔於2012-07-14). 
  7. ^ Andrés Calderón and Nelson Castillo. Why ARM's EABI matters. Linuxdevices.com. 2007-03-14 [2007-10-11]. (原始內容存檔於2012-07-14). 

外部連結