为什么在链接时不从DSO本身搜索rpath

时间:2018-08-10 16:25:13

标签: linker shared-libraries ld

我有libA.so,libB.so和可执行文件'foo'。 'foo'需要libB.so,而它本身需要libA.so。在链接期间,foo会与libB进行显式链接,因为它直接使用了它的符号。 'foo'不直接使用libA中的符号。链接'foo'时,ld要检查它是否可以解析libA中来自libB的符号引用,但找不到libA。我可以使用-Wl,rpath-link =使其找到libA,或者可以使链接程序使用-Wl,-allow-shlib-undefined忽略libA。

问题是我不必设置任何一个选项,因为libB.so包含一个rpath,它告诉链接器在哪里可以找到libA.so,并且链接器在运行时使用此rpath成功地找​​到libA。那为什么在链接时不使用它呢?在这种情况下,强制foo的构建配置知道完全不需要libA的地方?

1 个答案:

答案 0 :(得分:0)

  

我不需要设置任何一个选项,因为libB.so包含一个rpath,它告诉链接器在哪里可以找到libA.so,并且链接器在运行时使用此rpath

您正在混合使用静态链接器ld和运行时链接器(也称为加载程序)ld.so

在Linux上,它们分别来自binutils和GLIBC。它们是完全不同的程序,由不同的人员维护。

ld可能会实现ld.so当前版本的 使用的搜索路径,但这是

  • 大量的代码,需要从头开始编写
  • 一旦更改了ld.so搜索机制,就会中断

更新

  

不是对动态链接程序“标准”所执行的rpath的搜索

没有标准定义(我知道)。

此外,在Linux和Solaris上,ld.so使用的搜索路径可能包含诸如$ORIGIN$PLATFORM之类的动态标记,它们在(静态 )链接时间。