8
A
回答
9
按我的理解,每個可執行對象都有自己的「查找範圍」:
- 主可執行程序通常是在「全球」查找範圍內的第一個對象。這意味着主可執行文件中定義的符號會覆蓋依賴共享庫中的符號。使用
LD_PRELOAD
工具添加的共享對象被添加到全局查找範圍,緊跟在主可執行文件之後。 - 但是,如果要加載的共享對象使用
DF_SYMBOLIC
標誌,那麼符號引用該對象內的起源將查找定義在全球範圍內查找搜索前的對象之內。 - 使用
dlopen()
打開的共享對象可能有其自己的依賴關係。如果RTLD_GLOBAL
標誌在調用dlopen()
期間未設置,則這些依賴項會被添加到該對象的查找範圍中,但不會影響全局查找範圍。如果RTLD_GLOBAL
標誌被傳遞給dlopen()
,那麼共享對象(及其依賴關係)將被添加到「全局」查找範圍,從而改變後續符號查找的行爲。
烏利齊·德雷珀指南「How to Write Shared Libraries」推薦閱讀關於這一主題。
4
解析共享庫的符號時,加載器首先在'main executable'中進行搜索(讓主執行體覆蓋定義...)或者什麼?
是的,正好。動態加載器具有已加載的ELF對象的鏈表(列表頭爲_r_dynamic.r_map
),併線性查找該列表中的對象的動態符號表,直到找到正在查找的符號定義。
列表頭始終指向主可執行文件。如果給定的符號從主可執行文件導出,那麼它(幾乎)總是「勝出」(覆蓋其他定義)。
但是,請注意-Bsymbolic
鏈接器標誌有點改變圖片。
相關問題
- 1. ELF動態符號表
- 2. 查找順序編號
- 3. 動態加載控件的Tab順序
- 4. 重複的符號動態加載
- 5. 動態加載和符號共享
- 6. F#動態查找操作符重載
- 7. 控制動態加載腳本的加載順序
- 8. 定位和編輯加載程序的動態符號表?
- 9. 爲動態編譯的程序集加載符號
- 10. 如何重命名arm elf .so文件中的動態符號?
- 11. 以任何順序查找符號條目
- 12. 如何查找ELF的程序頭數
- 13. ELF中的符號地址
- 14. Magento靜態塊加載順序
- 15. Psycopg2找不到符號:在_PQbackendPID預計:動態查找
- 16. Linux用戶空間ELF加載程序
- 17. 動態加載:共享靜態庫中的未定義符號
- 18. 查找動態添加
- 19. 動態庫的加載順序是否重要?
- 20. 控制動態AJAX用戶控件的加載順序
- 21. 如何靜態查找動態加載的模塊
- 22. 加載時ELF重定位
- 23. ELF加載MIPS,malloc問題
- 24. 跟蹤加載ELF文件
- 25. AMD模塊的TypeScript動態加載結束於「無法找到符號」...'
- 26. 加載jQuery動畫的順序
- 27. 動態加載程序集
- 28. WebSphere 6.1更改類加載器順序
- 29. 程序集加載順序
- 30. java動態類加載器
爲了完整性:除非使用rdynamic選項(或類似選項)編譯它,否則不會將主要可執行文件的符號導出到動態符號表中, – debuti