我最近在系统升级后遇到了这个问题:使用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的行为。我知道了(感谢评论中的技巧),我将在这里回答我的问题。
我们试图加快工作中的一个软件项目的CI生成速度。在项目生命早期,有人提交了一些(按git的标准)巨大的二进制文件。仅仅为了摆脱它们而重写git的历史似乎太麻烦了,因此我们认为做一个浅表克隆可以避免那些大的早期提交就足够了。
我使用--depth克隆参数进行了一些实验,并遇到了一些奇怪的行为。这是git clone对此的帮助:
--depth <depth>
Create a shallow clone with a history truncated to the specified number of commits. Implies
--single-branch unless --no-single-branch is given to fetch the histories near the tips of all
branches. If you want to clone submodules shallowly, also pass --shallow-submodules.
Run Code Online (Sandbox Code Playgroud)
这将表明<depth>它将等于克隆期间将获取的提交数量,但事实并非如此。这是我尝试不同的深度值时得到的:
| depth | commit count linux repo | commit count git repo |
|---------|-------------------------|-----------------------|
| 1 | 1 | 1 |
| 5 | 15 | 13 |
| 10 …Run Code Online (Sandbox Code Playgroud)