我有一个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?
答案 0 :(得分:2)
如何在间接链接期间将RUNPATH传递给后续的SO?
如this answer中所述,您不能。
最好的方法是将所有库修复为自足的(具有自己正确的RUNPATH
)。
如果无法执行此操作,请通过在链接行中添加RPATH
来使用RUNPATH
而不是-Wl,--disable-new-dtags
。