ELF动态加载程序符号查找排序

时间:2012-10-01 00:14:47

标签: linux gcc ld elf binutils

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

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

2 个答案:

答案 0 :(得分:10)

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

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

Ulrich Drepper的指南“How to Write Shared Libraries”建议阅读此主题。

答案 1 :(得分:4)

  

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

是的,确切地说。动态加载器具有加载的ELF对象的链接列表(列表的头部为_r_dynamic.r_map)并且线性地搜索该列表中的对象的动态符号表,直到它找到它正在寻找的符号定义。

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

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