2017-05-28 98 views
0

如果動態鏈接器/加載器本身就是一個共享對象文件,它是如何正確加載到動態鏈接程序的過程映像空間(如果它尚未存在的話)?這是否是某種捕捉22的東西?加載動態鏈接器

+0

見[當/ Linux如何加載共享庫的地址空間?(https://stackoverflow.com/questions/5130654/) –

+0

從您的鏈接,發帖者說:「圖書館是由ld.so加載「,但是,我的問題是,如果ld.so本身是一個」庫「(共享對象文件),它是如何加載的... –

+0

而討論_'的部分被聲明爲」解釋器「(INTERP; .interp部分)所有動態鏈接的ELF二進制文件。所以,當你啓動程序時,Linux會啓動一個ld.so(加載到內存並跳轉到它的入口點),然後ld.so將你的程序加載到內存中,準備好並運行它。您也可以使用 '/lib/ld-linux.so.2 ./your_program your_prog_params'__啓動動態程序。內核加載並運行它,然後解釋二進制文件,從而避免了Catch-22,因爲內核會處理動態加載器的加載。注意我沒有使用Mjölnir! 「 –

回答

3

This answer提供了一些細節(雖然有技術錯誤)。

這是一種捕捉22的東西嗎?

是:ld.so特殊 - 這是一個自搬遷二進制。

它從仔細執行不需要任何重定位的代碼開始。該代碼本身重新定位ld.so。在完成自我重新定位/引導過程後,ld.so將繼續作爲常規共享庫。

+0

已就業,您是否可以通過編輯鏈接的答案或回答技術上正確的答案來糾正一些錯誤? – osgx

1

請參考 Oracle Solaris 11.1 Linkers and Libraries Guide 這是我遇到的最好的連接器參考,簡潔並且很好地解釋了事情。

在第89頁:

由於動態可執行文件的初始化和執行的一部分, 一個解釋被調用來完成應用程序的結合 它的依賴。在Oracle Solaris OS中,此解釋器爲 ,稱爲運行時鏈接程序。

在動態可執行文件的鏈接編輯過程中,會創建一個特殊的.interp節以及一個 關聯的程序頭。本部分包含一個路徑 名稱,指定程序的解釋器。鏈接編輯器提供的默認名稱 是運行時鏈接程序的名稱:/usr/lib/ld.so.1 (適用於32位可執行文件)和/usr/lib/64/ld.so.1適用於64位 可執行文件。

注 - ld.so.1是共享對象的特例。這裏,使用 的版本號。但是,以後的Oracle Solaris OS 版本可能會提供更高的版本號。

在 執行動態對象的過程中,內核加載文件並讀取程序頭信息。請參閱第371頁的「程序標題」。從 此信息,內核找到所需的 解釋程序的名稱。內核加載並將控制轉移給此解釋器,傳遞足夠的信息以使解釋器 繼續執行應用程序。