代码之家  ›  专栏  ›  技术社区  ›  Machta

如何用GCC/LD设置RPATH和RUNPATH?

  •  3
  • Machta  · 技术社区  · 6 年前

    -Wl,-rpath= 选项的工作方式与以前不同。

    我使用它来设置一些共享库的搜索路径,这些库是在我的项目的子模块中构建的。当时我认为这比设置 LD_LIBRARY_PATH 系统范围(我不想每次打开电脑都设置它)。一切都很好,这两种方法似乎是一样的。

    现在看来 -rpath 已经改变了。它仍然适用于直接依赖的库,但不适用于那些通过 -rpath= . 出口 图书馆路径

    我用 readelf 这是有区别的。升级之前(Linux Mint 18.2和GCC 5.4) 动态剖面 有这句台词:

    0x000000000000000f (RPATH)            Library rpath: [submod/lib]
    

    0x000000000000001d (RUNPATH)            Library runpath: [submod/lib]
    

    use RPATH but not RUNPATH? 有人建议用RUNPATH替换RPATH(或者至少因为它具有较低的优先级而服务于不同的目的),但是它没有给出为什么这会影响间接链接的答案。库本身没有RPATH或RUNPATH 自述 输出。

    为什么链接器突然开始解释 -路径= 选择不同,有没有办法强迫老行为?

    是否可以告诉旧版本的链接器生成新的输出(即RUNPATH而不是RPATH)?


    编辑

    这不是 How to set RunPath of a binary? --我的问题恰恰相反:我想要RPATH的行为。我想出来了(感谢评论中的提示),我会在这里回答我的问题。

    2 回复  |  直到 6 年前
        1
  •  8
  •   Machta    6 年前

    有没有办法强迫老行为?

    对。你可以使用这个选项 -Wl,--disable-new-dtags 新的 使用 古老的

    是否可以告诉旧版本的链接器生成新的输出(即.RUNPATH而不是RPATH?

    对。使用 -Wl,--enable-new-dtags 古老的 使用 行为,即运行路径。

    readelf ld 建议还是一样的:

    --启用新的DTAG

    这个链接器可以在ELF中创建新的动态标记。但较老的精灵系统可能无法理解它们。如果您指定 --启用新的dtag,将根据需要创建新的动态标记,并且 默认情况下,不会创建新的动态标记。 注意,这些选项是

        2
  •  3
  •   Javier    6 年前

    GNU Binutils项目(包含GNU链接器(ld))不是这种行为变化的根源,而是Debian(2016) 1 ,和Gentoo(2013年!) 2

    根据2013年1月Mike Frysinger的gentoo承诺:

    “新的”dtags选项已经存在14年多了,所以

    这个变化不太受欢迎 3 , 4 , 5 令人惊讶的是,这种变化现在已经应用到Debian stable上。

    但主要是有效的。来自维基百科:

    ld动态链接器不搜索DT\u运行路径位置 传递依赖项 ,与DT_RPATH不同。