8

解析动态重定位时符号查找的搜索顺序是什么?

当解析共享库的符号时,加载器首先在“主可执行文件”中搜索(让主可执行文件覆盖定义......)还是什么?

4

2 回答 2

11

据我了解,每个可执行对象都有自己的“查找范围”:

  • 主可执行文件通常是“全局”查找范围中的第一个对象。这意味着主可执行文件中定义的符号将覆盖依赖共享库中的符号。使用该工具添加的共享对象LD_PRELOAD被添加到全局查找范围中,就在主可执行文件之后。
  • 但是,如果正在加载的共享对象使用该DF_SYMBOLIC标志,则源自该对象的符号引用将在全局查找范围中搜索之前在该对象中查找定义。
  • 使用打开的共享对象dlopen()可能有自己的依赖关系。如果RTLD_GLOBAL在调用 期间未设置标志dlopen(),则这些依赖项将添加到该对象的查找范围,但不会影响全局查找范围。如果将RTLD_GLOBAL标志传递给dlopen(),则共享对象(及其依赖项)将添加到“全局”查找范围,从而更改后续符号查找的行为。

推荐阅读Ulrich Drepper 的指南“如何编写共享库”。

于 2012-10-01T04:17:07.703 回答
4

当解析共享库的符号时,加载器首先在“主可执行文件”中搜索(让主可执行文件覆盖定义......)还是什么?

对,就是这样。动态加载器有一个加载的 ELF 对象的链接列表(列表的开头是_r_dynamic.r_map),并线性搜索该列表中对象的动态符号表,直到找到它正在寻找的符号定义。

列表的头部始终指向主可执行文件。如果从主可执行文件中导出给定符号,则它(几乎)总是“获胜”(覆盖其他定义)。

但是,请注意-Bsymbolic链接器标志会稍微改变图片。

于 2012-10-01T03:19:49.093 回答