【问题标题】:Order of symbol lookup in .so dependency graph.so 依赖图中的符号查找顺序
【发布时间】:2019-02-13 06:22:44
【问题描述】:

假设我有一个共享对象加载时依赖关系图和符号 foo 在 .so 之一中引用。假设这个符号foo 也在其他几个共享对象中定义。我的问题是:将找到哪个定义,什么是查找顺序以及定义的位置(在什么标准,手册页中)?

示例: 考虑一个依赖图 https://i.imgur.com/jdhD3V0.png

其中以 ldd 顺序列出的库,例如

ldd a.so
b.so
d.so

让我们假设 foo 在 c.so 和 d.so 中定义并首先在 f.so 中引用。我的实验表明,来自 d.so 的实现将由链接器执行。看起来图书馆是按bfs 顺序搜索的。这是正确的吗?这是否与库加载顺序一致?我在任何文档中都找不到这个,必须确保它不是实现定义的。

谢谢!

【问题讨论】:

    标签: linker shared-libraries elf


    【解决方案1】:

    动态链接在ELF specfication 中指定。 (请注意,有一些非常旧的 PDF 和 Postscript 文件随处可见,但它们通常非常过时。)符号查找在 Shared Object Dependencies 部分中进行了描述:

    解析符号引用时,动态链接器使用广度优先搜索检查符号表。也就是说,它首先查看可执行程序本身的符号表,然后查看DT_NEEDED条目的符号表(按顺序),然​​后查看第二级DT_NEEDED条目,依此类推。

    (有各种扩展可以改变这种行为。ELF 规范本身定义了DF_SYMBOLIC flag。)

    这意味着您的问题无法回答,因为您的图表未显示主要可执行文件,并且不清楚搜索多个依赖项的顺序(从上到下或从下到上)。

    查找顺序是否与对象加载顺序匹配是实现定义的,因为根据 ELF 规范,仅仅加载一个对象(不执行其初始化函数)并不是具有可观察效果的东西。

    Initialization order(执行初始化函数的顺序)比符号查找顺序更受限制,因为DT_NEEDED 条目的顺序与此无关。所以理论上,一个实现有可能在b.so之前加载一个初始化d.so,但是来自b.so的符号插入了d.so的符号,因为它在符号搜索顺序中排在第一位(由于@的方式987654333@ 条目已排序)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-19
      • 2021-10-26
      相关资源
      最近更新 更多