Linker .so依赖关系图中符号查找的顺序

Linker .so依赖关系图中符号查找的顺序,linker,shared-libraries,elf,Linker,Shared Libraries,Elf,假设我有一个共享对象加载时间依赖关系图,其中一个.so中引用了符号foo。还假设此符号foo在其他几个共享对象中定义。我的问题是:将找到哪个定义,什么是查找顺序,以及在哪里定义它(在什么标准、手册页中) 例如: 考虑依赖图 如果库按ldd顺序列出,例如 ldd a.so b.so d.so 让我们假设foo在c.so和d.so中定义,并在f.so中首次引用。我的实验表明,d.so的实现将由链接器执行。看起来库是按顺序搜索的。是这样吗?这与图书馆的装载顺序一致吗?我在任何文档中都找不到这一点,

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

例如: 考虑依赖图

如果库按ldd顺序列出,例如

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


谢谢大家!

动态链接在中指定。(请注意,有一些非常旧的PDF和Postscript文件四处浮动,但这些文件通常非常过时。)第节介绍了符号查找:

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

(有各种各样的扩展改变了这种行为。ELF规范本身定义了这种行为。)

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

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

(执行初始化函数的顺序)比符号查找顺序受的约束更小,因为所需的
DT_
项的顺序与此无关。因此,理论上,一个实现可能在
b.So
之前加载一个初始化
d.So
,但是
b.So
中的符号插入
d.So
中的符号,因为它在符号搜索顺序中位于第一位(这是由于
DT\u所需的
条目的排序方式)