2013-03-03 94 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

相关问题