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 … 等動作。