代码之家  ›  专栏  ›  技术社区  ›  Isac Casapu

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

  •  1
  • Isac Casapu  · 技术社区  · 8 年前

    我有一个Linux共享对象,它与一些共享对象动态链接,其中一些对象又与其他共享对象动态链接,需要 间接动态链接 . 为了找到这些SOs,我将一个RPATH头嵌入到我的顶层中,因此通过将链接器标志传递到G++中,如下所示:

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

    这对Ubuntu 16.04和CentOS 7.x都有效(使用DevToolset 7中的G++7.3)。然而,在Ubuntu 18.04上执行这个构建时,它嵌入了一个RUNPATH头。与RPATH不同,RUNPATH只考虑查找我的顶级SO所需的SOs,而不考虑 间接动态链接

    我已经确认从RPATH到RUNPATH的更改导致了这个问题。当我使用在Ubuntu 16.04上构建的带有RPATH头的SO时,间接链接可以正常工作。当我使用 chrpath-c公司 ,间接链接中断,在Ubuntu 18.04和Ubuntu 16.04上。

    如何让链接器在Ubuntu 18.04上使用RPATH?或者,我怎样才能完成 chrpath-c公司 -将RUNPATH头更改为RPATH?

    1 回复  |  直到 8 年前
        1
  •  4
  •   Employed Russian    8 年前

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

    如中所述 this answer

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

    如果你做不到,用 RPATH 而不是 ,通过添加 -Wl,--disable-new-dtags 连接线。

    推荐文章