在 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 行。
我有一个 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 行。