
我剛剛讀過一個例子ABI 的。這是正確的嗎
ABI 與 API 類似,不同之處在於 ABI 是機器語言,而 API 是高階程式語言
ABI 是由機器語言編譯函式庫提供並屬於其的介面嗎? (如果我沒猜錯的話,一個自製的編譯庫提供了它的ABI(請參閱上面的例子)。作業系統可以被視為一個編譯函式庫,從而為應用程式存取其係統呼叫服務提供了自己的ABI。 )
上面的例子並沒有提到自製編譯函式庫的ABI是否依賴作業系統。
https://en.wikipedia.org/wiki/Application_binary_interface然而提到了作業系統:
ABI 涵蓋以下詳細資訊:
處理器指令集(詳細資訊如暫存器檔案結構、堆疊組織、記憶體存取類型等)
處理器可以直接存取的基本資料類型的大小、佈局和對齊方式
呼叫約定,控制函數參數的傳遞方式和傳回值的檢索方式;例如,是否所有參數都在堆疊上傳遞,或者某些參數在暫存器中傳遞,哪些暫存器用於哪些函數參數,以及堆疊上傳遞的第一個函數參數是首先還是最後壓入堆疊
應用程式應如何進行系統調用作業系統並且,如果 ABI 指定直接系統調用而不是對系統調用存根的過程調用,則系統調用號
而對於完整的作業系統ABI來說,則是目標檔案、程式庫等的二進位格式。
編譯庫的 ABI 是否取決於作業系統? (我想不會。即使編譯的函式庫透過作業系統的 ABI 使用系統呼叫服務,依賴作業系統(的 ABI)的是編譯的函式庫而不是其 ABI。)
編譯函式庫的 ABI 可以獨立於作業系統(的 ABI)嗎?
謝謝。
答案1
已編譯庫的 ABI 取決於其目標,且不一定包含作業系統。有一些用於沒有作業系統的嵌入式系統的函式庫,也有一些針對 Java 等平台的函式庫,它抽象化了作業系統的 ABI。
正如你所說,作業系統的 ABI 決定了函式庫(或程式)如何呼叫它;它不一定決定如何呼叫該庫。決定庫 ABI 的實際上是它的 API 以及它使用的編譯器的細節。編譯器通常會遵循目標平台的 ABI,但這不是特定於作業系統的;例如在 Linux 上,平台 ABI 是系統 V ELF ABI,具有特定於體系結構的處理器補充。
然而,作業系統的 ABI 可能會洩漏到庫的 ABI 中,例如,如果庫直接在其 ABI 中公開系統特定的結構。