main 函式與 ABI/API

一般 C 程式我們以為都是由 main 開始執行,其實在 main 之前,還必需做執行環境的建置。在 Linux 一般第一個呼叫的入口是 _start,它是屬於 glibc 的一部份。


elf 檔有兩種特殊的 section。.init 及 .fini section。.init 即是在 main 之前會執行的指令;而 .fini 則是 main 之後會執行的指令。我們可以將特殊需求的指令放在這兩個 section,以達到在進入 main 之前與之後做一些事。


基本上不同編譯器因為不支援 ABI (application binary interface),所以不同編譯器編出來的 object file 是不能共用的。ABI 與 API 很類似,但它著重在 binary level。以 printf 這個 API 來說,就算在不同的平台,但只要都是 Linux 的話,它就能保證 application 呼叫 printf 都可以正確無誤。但是它並不保證實作 printf 的部份會一致,如參數傳遞方式、堆疊配置等,這會依不同平台不同編譯器有所不同。因此 API 相同不代表 ABI 相同。


留言

熱門文章