在Ubuntu 18.04上构建共享库时,在其中嵌入RPATH而不是RUNPATH

时间:2018-08-21 16:11:52

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

我有一个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?

1 个答案:

答案 0 :(得分:2)

  

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

this answer中所述,您不能。

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

如果无法执行此操作,请通过在链接行中添加RPATH来使用RUNPATH而不是-Wl,--disable-new-dtags