# OS ABI 了解


## 簡介

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

根據 [System V ABI](https://wiki.osdev.org/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](https://zhuanlan.zhihu.com/p/692886292) 文章。

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

再看 [extern "C" 如何使系統函式庫兼容C與C++](https://hackmd.io/@rhythm/HyOxzDkmD)

