是否始终从符号命名空间的根开始查找不同共享库中的相同符号?

时间:2016-09-09 08:04:58

标签: linux linker shared-libraries elf

根据我收集的内容,共享库的默认可见性符号的符号名称查找以呼吸优先顺序迭代共享库依赖关系树,可执行程序是此搜索树的根。通过一个DT_NEEDED列表链接的所有库都与此树位于同一级别。

因此,当查找符号“foo”时,在我看来,它的查找在运行时确定性地始终绑定到相同的库或可执行文件。动态链接器是否利用了这个并且具有各种类型的“全局符号表”(可能与链接映射列表相关联),一旦首次查找符号,它就知道什么符号属于哪个共享库,并获取该地址的当符号被另一个共享库第二次查找时,那个库的GOT中的符号?或者这个符号总是被抬起来好像这是它的第一次查找?

1 个答案:

答案 0 :(得分:1)

  

因此,当一个符号" foo"查找起来,在我看来,它的查找确定性地始终在运行时绑定到同一个库或可执行文件。

此视图方式过于简化。存在许多复杂情况,例如在引用DSO时出现DT_SYMBOLIC,在加载定义DSO时存在RTLD_LOCAL(如果它没有直接链接),我相信其他一些目前我不记得的并发症。

  

动态链接器是否利用了这个并且有一个"全局符号表"各种各样的

GLIBC加载程序不会这样做。

  

或者总是会查找符号,就像这是第一次查找一样?

是。您可以使用LD_DEBUG=symbols,bindings ./a.out

进行观察