目錄

OS ABI 了解

簡介

常常說 ABI 是已經編譯好的程式和 OS 之間的介面規範,他規定的是 Binary 層級怎麼互動的。

根據 System V ABI,像是:

  • Calling Convention
    • 函式參數放在 stack/register
    • Return value 放哪裡
    • Stack frame layout
    • CPU 執行函式只是跳到某個函式第一個 instruction,編譯器產生的機器碼負責把第一個參數放在 stack/register
  • System Call Interface
  • 直接定義 Bianry Format,System V ABI 使用 ELF
  • Dynamic Linking 的規則
  • 資料類型的大小

最常見的就是以 C 的 ABI,C++ ABI 則複雜一點。

FreeBSD/Linux 雖然都遵守 System V ABI,但其中的 Kernel ABI 像是 syscall number, dynamic linker, thread library 都不太一樣,所以兩邊的程式不能直接無痛轉移執行。

只有可能 Linux .o 檔案透過 FreeBSD linker 在 FreeBSD 上面執行。

Rust

最常聽過的是 C/C++ ABI,那像是 Rust 也是 Native 可以在 OS 上面執行的程式,他也是要遵守 System V ABI。

Rust ABI 現在沒有穩定的定義。

C++ ABI

參考 彻底理解 C++ ABI 文章。

C++ 有物件的概念,所以像是傳遞參數可能傳一個物件,可能用到 move/copy … 等動作。

再看 extern “C” 如何使系統函式庫兼容C與C++