符号表中只有符号名的偏移量,没有符号属于哪个库的信息。
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 是否与符号的库有关?如果不是那么解析函数如何找到符号的库?
最佳答案
how does the resolving function find the lib of a symbol
通过线性搜索加载到进程(由加载器维护)的库。
第一个定义给定函数“wins”的库。这允许例如libtcmalloc.so
定义 malloc
、calloc
等并覆盖这些符号(您可以使用 LD_PRELOAD
、或在 libc
之前链接 libtcmalloc
,因此 libtcmalloc
在 libc
之前出现在加载器列表中)。
搜索在库的数量上是线性的,但在每个库中是O(1)
,因为每个库都有其符号的哈希表(在.hash
或 .gnu_hash
部分)。
关于c++ - ELF 文件中的 resolve 函数如何知道符号在哪些库中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15190185/