Linux

什麼要求 _start 入口點(核心、ld-linux.so 等)?

  • May 22, 2020

我知道 ELF 執行檔需要有一個可見_start的執行開始的子常式。但是,據我所知,核心實際上呼叫ld-linux.so(或其他一些解釋器)並將執行交給它。所以,我的問題是:

  1. 誰規定了_start入口點?
  2. 核心如何“呼叫” 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 有一篇關於程序如何執行第二部分)的優秀的兩部分文章,如果您真的想深入了解該主題的細節,我建議您閱讀這篇文章。

引用自:https://unix.stackexchange.com/questions/588240