在 Ubuntu 18.04 上构建 shared-objects 时嵌入 RPATH 而不是 RUNPATH

Embed RPATH instead of RUNPATH in when building shared-objects on Ubuntu 18.04

我有一个 Linux shared-object,它 link 动态地与一些 shared-object 一起,其中一些又 link 动态地进一步与额外 shared-objects,需要 间接动态 linking。为了找到那些 SO,我将 RPATH header 嵌入到我的 top-level SO 中,方法是将 linker 标志传递给 G++,如下所示:

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

这适用于 Ubuntu 16.04 和 CentOS 7.x(使用来自 DevToolset 7 的 G++ 7.3)。但是,在 Ubuntu 18.04 上执行此构建时,它会嵌入一个 RUNPATH header。与 RPATH 不同,RUNPATH 仅用于查找我的 top-level SO 所需的 SO,而不用于 间接动态 linking 他们需要的后续 SO。

我已经确认从 RPATH 到 RUNPATH 的更改导致了这个问题。当我使用基于 Ubuntu 16.04 构建的 SO 时,它具有 RPATH header,间接 linking 正常工作。当我使用 chrpath -c 将 RPATH header 更改为 RUNPATH header 时,在两个 Ubuntu 18.04 上间接 linking 中断和 Ubuntu 16.04.

如何让 link 用户在 Ubuntu 18.04 上使用 RPATH?或者,我如何完成 chrpath -c 的逆运算 - 将 RUNPATH header 更改为 RPATH?

How can I get RUNPATH to be passed down to subsequent SOs during indirect linking?

中所述,您不能。

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

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