我有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的地方?
答案 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
之类的动态标记,它们在(静态 )链接时间。