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



我有一个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 时,间接链接可以正常工作。当我使用chrpath -c将 RPATH 标头更改为 RUNPATH 标头时,间接链接会在 Ubuntu 18.04 和 Ubuntu 16.04 上中断。

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

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

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

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

如果无法执行此操作,请使用RPATH而不是RUNPATH,方法是将-Wl,--disable-new-dtags添加到链接行。

最新更新