Linux
什麼要求 _start 入口點(核心、ld-linux.so 等)?
我知道 ELF 執行檔需要有一個可見
_start
的執行開始的子常式。但是,據我所知,核心實際上呼叫ld-linux.so
(或其他一些解釋器)並將執行交給它。所以,我的問題是:
- 誰規定了
_start
入口點?- 核心如何“呼叫”
ld-linux.so
?它有穩定的 API 嗎?一個_start
功能,可以這麼說?獎勵問題:粗略一看,Glibc 似乎都是同一個程式碼庫的一部分,
libdl
並且ld-linux.so
緊密地纏繞在一起(使用彼此的私有介面)。這是否意味著不可能編寫自定義libdl
等效庫來實現dlopen
等?非 C 系統語言是否不可能生成不依賴libc
並且仍然可以載入文件的二進製*.so
文件?
入口點通常命名為
_start
,並在連結到執行檔的 C 執行時彙編常式中定義。這段簡短的程式碼負責設置堆棧,可能呼叫 C++ 建構子,最後呼叫main
. 程序開始執行的確切答案是e_entry
執行檔中 ELF 標頭中的值。_start
該值由連結器設置為指向。您可以通過使用 . 檢查可執行程序來看到這一點
readelf -a progfile
。動態連結有點複雜,因為動態連結器首先載入和啟動,負責載入和連結程序所需的共享庫。動態連結器也在執行檔中指定(稱為“程序解釋器”。)
Lwn.net 有一篇關於程序如何執行(第二部分)的優秀的兩部分文章,如果您真的想深入了解該主題的細節,我建議您閱讀這篇文章。