【问题标题】:Embed RPATH instead of RUNPATH in when building shared-objects on Ubuntu 18.04在 Ubuntu 18.04 上构建共享对象时嵌入 RPATH 而不是 RUNPATH
【发布时间】:2019-01-27 21:13:26
【问题描述】:

我有一个 Linux 共享对象,它与一些共享对象动态链接,其中一些又与其他共享对象进一步动态链接,需要 间接动态链接。为了找到那些 SO,我通过将链接器标志传递给 G++,将 RPATH 标头嵌入到我的顶级 SO 中,如下所示:

 -Xlinker -rpath -Xlinker $ORIGIN/../my/libs

这适用于 Ubuntu 16.04 和 CentOS 7.x(使用 DevToolset 7 中的 G++ 7.3)。但是,在 Ubuntu 18.04 上执行此构建时,它会嵌入一个 RUNPATH 标头。与 RPATH 不同,RUNPATH 仅用于查找我的顶级 SO 所需的 SO,而不是用于它们所需的后续 SO 的间接动态链接

我已确认从 RPATH 更改为 RUNPATH 会导致问题。当我使用在 Ubuntu 16.04 上构建的具有 RPATH 标头的 SO 时,间接链接可以正常工作。当我在 Ubuntu 18.04 和 Ubuntu 16.04 上使用 chrpath -c 将 RPATH 标头更改为 RUNPATH 标头时,间接链接中断。

如何让链接器在 Ubuntu 18.04 上使用 RPATH?或者,如何完成 chrpath -c 的逆操作 - 将 RUNPATH 标头更改为 RPATH?

【问题讨论】:

标签: g++ ld dynamic-linking ubuntu-18.04 rpath


【解决方案1】:

如何在间接链接期间将 RUNPATH 传递给后续 SO?

正如this answer 中所述,您不能。

最好的方法是将所有库修复为自给自足(拥有自己正确的RUNPATH)。

如果您不能这样做,请使用RPATH 而不是RUNPATH,将-Wl,--disable-new-dtags 添加到链接行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-19
    • 2018-11-10
    • 2019-10-24
    • 2015-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多