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

Joh*_*ugo 8 linux gcc elf ld binutils

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

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

jko*_*shy 10

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

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

Ulrich Drepper的指南" 如何编写共享库 "建议阅读本主题.