Linker .so依赖关系图中符号查找的顺序
假设我有一个共享对象加载时间依赖关系图,其中一个.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的实现将由链接器执行。看起来库是按顺序搜索的。是这样吗?这与图书馆的装载顺序一致吗?我在任何文档中都找不到这一点,
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所需的
条目的排序方式)