在符号表中,只有符号名称的偏移量,但没有关于符号所属的lib的信息。
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有关?如果没有那么解析函数如何找到符号的lib?
答案 0 :(得分:1)
解析函数如何找到符号的lib
通过线性搜索加载到进程中的库(加载器维护)。
定义给定函数的第一个库“wins”。这允许例如libtcmalloc.so
定义malloc
,calloc
等,并覆盖这些符号(您可以使用LD_PRELOAD
,也可以libtcmalloc
之前链接libc
,所以在libtcmalloc
之前libc
出现在加载程序列表中。
搜索在库的数量上是线性的,但在每个库中都是O(1)
,因为每个库都有一个符号的哈希表(在.hash
或.gnu_hash
部分)