2013-03-03 92 views
0

在符號表中,只有符號名稱的偏移量,但沒有符號屬於哪個庫的信息。ELF文件中的解析函數如何知道哪些庫是符號?

 

    typedef struct { 
     Elf32_Word st_name; 
     Elf32_Addr st_value; 
     Elf32_Word st_size; 
     unsigned char st_info; /* bind, type: ELF_32_ST_... */ 
     unsigned char st_other; 
     Elf32_Half st_shndx; /* SHN_... */ 
    } Elf32_Sym; 

當解析函數被調用在運行時,該符號表和另一個DWORD的偏移被傳遞給它。該DWORD與符號的lib有關嗎?如果沒有,那麼解析函數如何找到符號的庫?

回答

1

如何分辨功能找到一個符號

的lib通過線性搜索加載到過程(其裝載機維持)的庫。

第一個定義給定函數的庫「獲勝」。這允許例如libtcmalloc.so定義malloccalloc等,覆蓋這些符號(你要麼libc之前使用LD_PRELOAD或鏈接libtcmalloc,所以libtcmalloc出現在裝載機列表libc不前)。

由於每個庫都有其符號的散列表(在.hash.gnu_hash部分中),因此每個庫內的搜索對於庫數是線性的,但是是O(1)

+0

是的,ELF與Windows PE文件的對比,我認爲Apple Mac-O格式不會將導出的符號綁定到給定的動態庫:在全部庫中搜索寬度優先的搜索(在邊緣爲'DT_NEEDED'條目 - 這是ELF模塊的依賴關係)。使用的圖形是全局圖形,而不是當前ELF文件的子圖形。 – ysdx 2015-08-21 11:03:46

相關問題