api 是應用程式和作業系統之間的介面,凡是符合該api標準的應用程式都可以在支援該api的作業系統上編譯通過。
abi 是二進位制級別的介面,規定了二進位制檔案的格式、內容、裝載/解除安裝程式的要求、函式呼叫時的引數傳遞
規則、暫存器、堆疊的使用。
如果作業系統都支援該api,但是機器的體系結構不同即他們的abi不同,那麼在乙個機器上生成的二進位制**是不可以在另外一台機器上面執行成功的,可能因為函式呼叫的引數傳遞規則不同或者其他由abi定義的行為產生的差異性。
其實關鍵的是abi定義了執行時的相容性問題,這個問題是api無法解決的。api所能解決的是靜態狀態下的相容性問題。
abi是系統與應用之間的協議. 乙個binary(exec, lib)必需符合abi才能在相應的系統上執行.
比如我在pc上用不管什麼樣的compiler, 只要產生符合linux的elf檔案, 用相應的instruction set(比如intel, ppc, sparc). 就可以在乙個linux機器上執行. 呼叫系統或別人的lib.
abi定義了binary的檔案格式, 內容, 以及裝載/解除安裝程式的要求, 函式呼叫的引數傳遞規則, 暫存器, 堆疊的使用等.
abi(應用二進位制介面)我的理解就是機器**一層的介面。先說一下api(特指系統呼叫),
api基本上是和機器硬體平台無關但是和作業系統密切相關的介面,乙個api呼叫定義了乙個對核心的操作,以及操作的引數。c語言會議函式的形式呼叫api。
abi,是比api更貼近硬體的一層介面,它規定的是二進位制**之間的呼叫規則。舉個例子來說吧!
乙個應用程式,呼叫了.so庫中的函式或者系統呼叫,如果它的編譯器可以找到被呼叫函式或者系統
呼叫的話,則編譯可以同過,也就是說,它是用的api是正確的。但是,這個呼叫離成功還很遠。。。。。
首先,如果編譯出來的**和執行庫函式和系統呼叫的**不是乙個硬體平台的,則這個應用根本就不能和被呼叫**執行在一起,則呼叫不會成功。
即使庫函式、系統呼叫和是執行在同一硬體平台上的呼叫也不一定會趁成功。因為程式最終是被編譯成二進位制**的,並且是要載入到記憶體中執行的。那麼,在呼叫庫函式或者系統呼叫的時候,應用要先要以庫函式或者系統呼叫指定的方式和位置(記憶體或者暫存器)設定引數,然後通過中斷或者其他方式跳轉到被呼叫**的起始處進行執行,被呼叫**從指定位置去到引數,處理完畢之後再將結果放到指定的位置,最後應用再到指定的地方取回結果,呼叫完畢!
我認為這個過程中,存放引數和結果的位置屬於abi規定的範圍,被呼叫程式的跳轉位址或者中斷號碼也是abi規定的範圍。如果訪問引數、結果的位置沒有明確的規範,或者呼叫、被呼叫雙方沒有遵照統一個規範,那麼這個呼叫根本就不可能成功;如果系統提供的庫函式路徑不正確,呼叫也不會成功;如果中斷**使用錯誤,呼叫也不會正確。abi 就是在這個層次上對應用程式的乙個規範。
在計算機中,應用二進位制介面描述了應用程式(或者其他型別)和
作業系統
之間或其他應用程式的低階介面。
abi涵蓋了各種細節:如資料型別、大小和對齊;呼叫約定(控制著函式的引數如何傳送以及如何接受返回值);系統呼叫的編碼和乙個應用如何向作業系統進行系統呼叫;以及在乙個完整的作業系統abi中,目標檔案的二進位制格式、程式庫等等。乙個完整的abi,像intel二進位制相容標準 (ibcs),允許支援它的作業系統上的程式不經修改在其他支援此abi的操作體統上執行。
其他的 abi 標準化細節包括 c++ 名稱修飾,和同乙個平台上的編譯器之間的呼叫約定,但是不包括跨平台的相容性。
abi不同於應用程式介面(api),api定義了源**和庫之間的介面,因此同樣的**可以在支援這個api的任何系統中編譯,然而abi允許編譯好的目標**在使用相容abi的系統中無需改動就能執行。 在unix風格的作業系統中,存在很多執行在同一硬體平台上互相相關但是不相容的作業系統(尤其是intel 80386相容系統)。有一些努力嘗試標準化abi,以減少銷售商將程式移植到其他系統時所需的工作。然而,直到現在還沒有很成功的例子,雖然linux標準化工作組正在為linux做這方面的努力。
嵌入式應用二進位制介面指定了檔案格式、資料型別、暫存器使用、堆積組織優化和在乙個嵌入式軟體中的引數的標準約定。開發者使用自己的組合語言也可以使用eabi作為與相容的編譯器生成的組合語言的介面。 支援eabi的編譯器建立的目標檔案可以和使用類似編譯器產生的**相容,這樣允許開發者鏈結乙個由不同編譯器產生的庫。eabi與關於通用計算機的abi的主要區別是應用程式**中允許使用特權指令,不需要動態鏈結(有時是禁止的),和更緊湊的堆疊幀組織用來節省記憶體。廣泛使用eabi的有power pc和arm.
交叉編譯和ABI簡介
最近處理乙個問題,需要在ubuntu下使用gcc編譯出多個平台版本做驗證,發現對交叉編譯這塊有點模糊。導致工作效率略受影響,因此打算學習一下。交叉編譯器 cross compiler 就是乙個可以編譯在別的平台執行的程式的編譯器。例如在windows上編譯安卓apk的編譯器就是交叉編譯器。在交叉編譯...
GNU 是什麼,和 Linux 是什麼關係?
unix 系統被發明之後,大家用的很爽。但是後來開始收費和商業閉源了。乙個叫 rms 的大叔覺得很不爽,於是發起 gnu 計畫,模仿 unix 的介面和使用方式,從頭做乙個開源的版本。然後他自己做了編輯器 emacs 和編譯器 gcc。gnu 是乙個計畫或者叫運動。在這個旗幟下成立了 fsf,起草了...
開心和快樂是什麼?
一直在堅強地呼吸著,一直在頑強地抵抗著,一直在艱難地蹣跚著,一直在孤獨地摸索著,一直在疲倦地生活著,一直在無奈地表演著,一直在偏執地守候著,一直在天真地夢想著.耳邊的掌聲響了又靜了!我卻一直忘了,開心和快樂是什麼!純美的幻想是你明天的歸宿麼?嘴角的微笑是你永恆的憂傷麼?是你的魂魄麼?歌聲是你的傾訴麼...