ELF文件中的resolve函数如何知道库中的符号是什么?

时间:2013-03-03 20:00:24

标签: c++ debugging elf

在符号表中,只有符号名称的偏移量,但没有关于符号所属的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?

1 个答案:

答案 0 :(得分:1)

  

解析函数如何找到符号的lib

通过线性搜索加载到进程中的库(加载器维护)。

定义给定函数的第一个库“wins”。这允许例如libtcmalloc.so定义malloccalloc等,并覆盖这些符号(您可以使用LD_PRELOAD,也可以libtcmalloc之前链接libc,所以在libtcmalloc之前libc出现在加载程序列表中。

搜索在库的数量上是线性的,但在每个库中都是O(1),因为每个库都有一个符号的哈希表(在.hash.gnu_hash部分)