http://book.51cto.com/art/201412/460857.htm
《Linux系統編程(第2版)》第1章入門和基本概念,這一章着眼於Linux系統編程的基礎概念並從程序員視角探索Linux系統。本節為大家介紹ABI。
1.2.2 ABI
API定義了源碼接口,而ABI定義了兩個軟件模塊在特定體系結構上的二進制接口。它定義了應用內部如何交互,應用如何與內核交互,以及如何和庫交互。API保證了源碼兼容,而ABI保證了“二進制兼容(binary compatibility)”,確保對於同一個ABI,目標代碼可以在任何系統上正常工作,而不需要重新編譯。
ABI主要關注調用約定、字節序、寄存器使用、系統調用、鏈接、庫的行為以及二進制目標格式。例如,調用約定定義了函數如何調用,參數如何傳遞,分別保留和使用哪些寄存器,調用方如何獲取返回值。
盡管曾經在不同操作系統上為特定的體系結構定義一套唯一的ABI,做了很多努力,但是收效甚微。相反地,操作系統(包括Linux)往往會各自定義自己獨立的ABI,這些ABI和體系結構緊密關聯,絕大部分ABI表示了機器級概念,比如特定的寄存器或匯編指令。因此,在Linux,每個計算機體系結構都定義了自己的ABI。實際上,我們往往通過機器體系結構名稱來稱呼這些ABI,如Alpha或x86-64。因此,ABI是操作系統(如Linux)和體系結構(如x86-64)共同提供的功能。
系統編程需要有ABI意識,但通常沒有必要記住它。ABI並沒有提供顯式接口,而是通過工具鏈(toolchain),如編譯器、鏈接器等來實現。盡管如此,了解ABI可以幫助你寫出更優化的代碼,而如果你的工作就是編寫匯編代碼或開發工具鏈(也屬於系統編程范疇),了解ABI就是必需的。
ABI是由內核和工具鏈定義和實現的。