我最近在升级系统后遇到了这个问题:使用GCC -Wl,-rpath =选项的工作方式与以前不同.
我用它来设置一些共享库的搜索路径,这些库是在我项目的子模块中构建的.当时我认为它比在系统范围内设置LD_LIBRARY_PATH更好(我不想每次打开电脑时都设置它).一切都很好,这两种方法似乎相同.
现在它接收到-rpath的行为已经改变了.它仍适用于直接依赖库,但不适用于通过-rpath =链接同一目录集中的其他库的库.导出LD_LIBRARY_PATH仍然像以前一样工作.
我使用readelf检查了编译的输出,但有一点不同.在升级之前(Linux Mint 18.2 with GCC 5.4),Dynamic部分有这一行:
0x000000000000000f (RPATH) Library rpath: [submod/lib]
升级后(Linux Mint 19 with GCC 7.3),该行改为:
0x000000000000001d (RUNPATH) Library runpath: [submod/lib]
在use RPATH but not RUNPATH?中,建议将RPATH替换为RUNPATH(或者它至少服务器具有不同的目的,因为它具有较低的优先级),但它没有给出为什么这会影响间接链接的答案.库本身在readelf输出中既没有RPATH,也没有RUNPATH.
所以我的问题是:为什么链接器突然开始以不同的方式解释-rpath =选项,是否有办法强制旧的行为? (或者做一些不同的事情,产生相同的结果.)
另一个问题是:是否有可能告诉旧版本的链接器产生新的输出(即RUNPATH而不是RPATH)?
编辑
这不是How to set RunPath of a binary?的重复 – 我的问题恰恰相反:我想要RPATH的行为.我想通了(感谢评论中的提示),我将在这里回答我的问题.