【问题标题】:How does the resolve function in ELF files know what libs are the symbols in?ELF 文件中的解析函数如何知道符号所在的库?
【发布时间】:2013-03-03 20:00:24
【问题描述】:

符号表中只有符号名的偏移量,没有符号属于哪个库的信息。

类型定义结构{ Elf32_Word st_name; Elf32_Addr st_value; Elf32_Word st_size; 无符号字符 st_info; /* 绑定,类型:ELF_32_ST_... */ 无符号字符 st_other; Elf32_Half st_shndx; /* SHN_... */ } Elf32_Sym;

在运行时调用解析函数时,会将符号表的偏移量和另一个 DWORD 传递给它。该 DWORD 是否与符号的库有关?如果不是,那么解析函数如何找到符号的库?

【问题讨论】:

    标签: c++ debugging elf


    【解决方案1】:

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

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

    第一个定义给定函数“wins”的库。这允许例如libtcmalloc.so 定义malloccalloc 等并覆盖这些符号(您要么使用LD_PRELOAD,要么在libc 之前链接libtcmalloc,因此libtcmalloc 出现在加载器列表中@987654328 之前@ 确实)。

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

    【讨论】:

    • 是的,ELF 与 Windows PE 文件对比,我认为 Apple Mac-O 格式不会将导出的符号绑定到给定的动态库:在广度优先搜索的所有库中搜索 tjhey(在其边是DT_NEEDED 条目的图——即 ELF 模块之间的依赖关系)。使用的图是全局图,而不是当前 ELF 文件的子图。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-25
    • 1970-01-01
    • 2012-05-02
    • 1970-01-01
    • 1970-01-01
    • 2011-10-29
    • 2011-05-26
    相关资源
    最近更新 更多