c++ - ELF 文件中的 resolve 函数如何知道符号在哪些库中?

标签 c++ debugging 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 是否与符号的库有关?如果不是那么解析函数如何找到符号的库?

最佳答案

how does the resolving function find the lib of a symbol

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

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

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

关于c++ - ELF 文件中的 resolve 函数如何知道符号在哪些库中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15190185/

相关文章:

c++ - 固定数量的参数包元素来初始化模板化类

c++ - 汽车扣除不一致

c++ - 使用嵌套模板进行模板化

debugging - 在 valgrind 中仍然可以访问

java - 在 Java 中提取 ELF 的 .text 部分

python - 有没有办法只使用 python 库生成 ELF BINARY?

c++ - `-fno-semantic-interposition` 与 `-fvisibility=protected` 究竟有何不同?

c++ - 在 Visual Studio 中使用 C++ 类 - 未声明的标识符错误

asp.net - 后面代码中的断点未命中

.net - 是否可以同时调试 Silverlight 和 WCF 项目?