【问题标题】:Why doesn't ld search rpaths from a DSO itself at link time为什么 ld 不在链接时从 DSO 本身搜索 rpath
【发布时间】:2019-01-18 07:24:09
【问题描述】:

我有 libA.so、libB.so 和一个可执行文件“foo”。 'foo' 需要 libB.so,而 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 在哪里似乎完全没有必要?

【问题讨论】:

    标签: linker shared-libraries ld


    【解决方案1】:

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

    您正在混淆静态链接器 ld 和运行时链接器(又名加载器)ld.so

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

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

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

    更新:

    不是动态链接器'标准'执行的rpath搜索

    没有定义这个的标准(据我所知)。

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

    【讨论】:

    • 我明白了,谢谢。但是动态链接器'标准'执行的rpath搜索不是,所以如果ld找不到ld.so可以找到的库,那么它只是ld中的一个错误。 (实现错误/功能的复杂性不会影响其正确性)。
    猜你喜欢
    • 2010-12-21
    • 2015-11-12
    • 2014-08-27
    • 2012-10-26
    • 1970-01-01
    • 2014-11-26
    • 1970-01-01
    • 2023-02-10
    • 1970-01-01
    相关资源
    最近更新 更多