如果動態鏈接器/加載器本身就是一個共享對象文件,它是如何正確加載到動態鏈接程序的過程映像空間(如果它尚未存在的話)?這是否是某種捕捉22的東西?加載動態鏈接器
加載動態鏈接器
回答
This answer提供了一些細節(雖然有技術錯誤)。
這是一種捕捉22的東西嗎?
是:ld.so
爲特殊 - 這是一個自搬遷二進制。
它從仔細執行不需要任何重定位的代碼開始。該代碼本身重新定位ld.so
。在完成自我重新定位/引導過程後,ld.so
將繼續作爲常規共享庫。
已就業,您是否可以通過編輯鏈接的答案或回答技術上正確的答案來糾正一些錯誤? – osgx
請參考 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頁的「程序標題」。從 此信息,內核找到所需的 解釋程序的名稱。內核加載並將控制轉移給此解釋器,傳遞足夠的信息以使解釋器 繼續執行應用程序。
- 1. 鏈接動態加載javascript
- 2. 加載和動態鏈接
- 3. 動態加載和動態鏈接
- 4. 動態鏈接v/s動態加載
- 5. 動態鏈接器和動態加載器有什麼區別?
- 6. jquery動態加載鏈接變化
- 7. 加載時動態鏈接和運行時動態鏈接之間的區別
- 8. 動態鏈接和加載時間鏈接.DLL
- 9. 動態添加鏈接到鏈接
- 10. 如何使用eclipse鏈接指定動態類加載器
- 11. 鏈接器問題或其他?動態加載庫
- 12. libs突然不會加載動態鏈接器(NDK)
- 13. 動態鏈接和動態加載有什麼區別
- 14. 共享庫的動態鏈接或動態加載?
- 15. 動態庫加載與鏈接到靜態庫
- 16. 動態加載DLL接口
- 17. PHP啓動:無法加載動態鏈接庫(xsl.so/libexslt.so.0)
- 18. 動態鏈接
- 19. 動態鏈接
- 20. 動態鏈接到靜態鏈接?
- 21. import =動態鏈接? &include =靜態鏈接?
- 22. 如何做動態下載鏈接
- 23. 動態下載鏈接算法
- 24. java動態類加載器
- 25. Java類加載器動態
- 26. 阻止鏈接加載模態窗口中點擊的鏈接
- 27. 創建XML超鏈接下載鏈接動態
- 28. 是否有可能預加載鏈接,動態加載到頁面?
- 29. 靜態鏈接glibc,但動態使用GCC動態鏈接glibc
- 30. jQuery,php和Ajax問題:無法使動態鏈接加載動態內容
見[當/ Linux如何加載共享庫的地址空間?(https://stackoverflow.com/questions/5130654/) –
從您的鏈接,發帖者說:「圖書館是由ld.so加載「,但是,我的問題是,如果ld.so本身是一個」庫「(共享對象文件),它是如何加載的... –
而討論_'的部分被聲明爲」解釋器「(INTERP; .interp部分)所有動態鏈接的ELF二進制文件。所以,當你啓動程序時,Linux會啓動一個ld.so(加載到內存並跳轉到它的入口點),然後ld.so將你的程序加載到內存中,準備好並運行它。您也可以使用 '/lib/ld-linux.so.2 ./your_program your_prog_params'__啓動動態程序。內核加載並運行它,然後解釋二進制文件,從而避免了Catch-22,因爲內核會處理動態加載器的加載。注意我沒有使用Mjölnir! 「 –