1、比如我在PC上用不管什么樣的COMPILER, 只要產生符合LINUX的ELF文件, 用相應的INSTRUCTION SET(比如INTEL, PPC, SPARC). 就可以在一個LINUX機器上運行. 調用系統或別人的LIB.ABI定義了BINARY的文件格式, 內容, 以及裝載/卸載程序的要求, 函數調用的參數傳遞規則, 寄存器, 堆棧的使用等. abi(應用二進制接口)我的理解就是機器代碼一層的接口。
2、先說一下api(特指系統調用),api基本上是和機器硬件平臺無關但是和操作系統密切相關的接口,一個api調用定義了一個對內核的操作,以及操作的參數。
3、C語言會議函數的形式調用api。
【資料圖】
4、abi,是比api更貼近硬件的一層接口,它規定的是二進制代碼之間的調用規則。
5、舉個例子來說吧!一個應用程序,調用了.so庫中的函數或者系統調用,如果它的編譯器可以找到被調用函數或者系統調用的話,則編譯可以同過,也就是說,它是用的api是正確的。
6、但是,這個調用離成功還很遠。
7、 首先,如果編譯出來的代碼和運行庫函數和系統調用的代碼不是一個硬件平臺的,則這個應用根本就不能和被調用代碼運行在一起,則調用不會成功。
8、即使庫函數、系統調用和是運行在同一硬件平臺上的調用也不一定會趁成功。
9、因為程序最終是被編譯成二進制代碼的,并且是要加載到內存中運行的。
10、那么,在調用庫函數或者系統調用的時候,應用要先要以庫函數或者系統調用指定的方式和位置(內存或者寄存器)設置參數,然后通過中斷或者其他方式跳轉到被調用代碼的起始處進行執行,被調用代碼從指定位置去到參數,處理完畢之后再將結果放到指定的位置,最后應用再到指定的地方取回結果,調用完畢!我認為這個過程中,存放參數和結果的位置屬于abi規定的范圍,被調用程序的跳轉地址或者中斷號碼也是abi規定的范圍。
11、如果存取參數、結果的位置沒有明確的規范,或者調用、被調用雙方沒有遵照統一個規范,那么這個調用能夠根本就不可能成功;如果系統提供的庫函數路徑不正確,調用也不會成功;如果中斷代碼使用錯誤,調用也不會正確。
本文到此分享完畢,希望對大家有所幫助。