相关疑难解决方法(0)

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

我最近在系统升级后遇到了这个问题:使用GCC -Wl,-rpath=选项的工作方式与以前不同。

我用它来设置一些在我的项目子模块中构建的共享库的搜索路径。当时我认为它比在LD_LIBRARY_PATH系统范围内进行设置要好(我不想每次打开计算机时都进行设置)。一切正常,这两种方法似乎是等效的。

现在,它的行为-rpath已经改变。它仍然适用于直接依赖的库,但不适用于通过链接来自同一目录集的其他库的库-rpath=。导出LD_LIBRARY_PATH仍然可以像以前一样进行。

我使用来检查了编译的输出,readelf并且有所不同。升级之前(Linux Mint 18.2和GCC 5.4),“ 动态”部分具有以下内容:

0x000000000000000f (RPATH)            Library rpath: [submod/lib]
Run Code Online (Sandbox Code Playgroud)

升级后(带有GCC 7.3的Linux Mint 19),该行更改为:

0x000000000000001d (RUNPATH)            Library runpath: [submod/lib]
Run Code Online (Sandbox Code Playgroud)

使用RPATH而不是RUNPATH吗?建议将RPATH替换为RUNPATH(或者说,它至少具有不同的用途,因为它的优先级较低),但是它没有给出答案为什么会影响间接链接。库本身在readelf输出中既没有RPATH也没有RUNPATH 。

所以我的问题是:为什么链接程序突然开始以-rpath=不同的方式解释选项,并且有办法强制执行旧的行为?(或者做一些不同的事情,将产生相同的结果。)

另一个问题是:是否可以告诉链接器的旧版本产生新的输出(即RUNPATH而不是RPATH)?


编辑

这不是如何设置二进制文件的RunPath的副本-我的问题恰恰相反:我想要RPATH的行为。我知道了(感谢评论中的技巧),我将在这里回答我的问题。

linux gcc shared-libraries dynamic-linking ld

6
推荐指数
2
解决办法
3536
查看次数

标签 统计

dynamic-linking ×1

gcc ×1

ld ×1

linux ×1

shared-libraries ×1