在 Ubuntu 18.04 上构建共享对象时嵌入 RPATH 而不是 RUNPATH

问题描述 投票:0回答:2

我有一个 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 上构建的 SO(具有 RPATH 标头)时,间接链接可以正常工作。当我使用

chrpath -c 将 RPATH 标头更改为 RUNPATH 标头时,在 Ubuntu 18.04 和 Ubuntu 16.04 上,间接链接都会中断。

如何让链接器在 Ubuntu 18.04 上使用 RPATH?或者,如何完成

chrpath -c 的逆操作 - 将 RUNPATH 标头更改为 RPATH?

g++ ld dynamic-linking ubuntu-18.04 rpath
2个回答
6
投票
如何在间接链接期间将 RUNPATH 传递到后续 SO?

正如

这个答案中所解释的,你不能。

最好的方法是修复所有库,使其自给自足(有自己正确的

RUNPATH

)。

如果您无法做到这一点,请使用

RPATH

 代替 
RUNPATH
,方法是将 
-Wl,--disable-new-dtags
 添加到链接行。


0
投票
没有好的工具可以做到这一点,但您可以手动将 elf 二进制文件的动态部分的 DT_RUNPATH 字节编辑为 0,这将逆转行为的变化。

© www.soinside.com 2019 - 2024. All rights reserved.