我的影片定于垃圾堆的旧可执行文件,但它现在还没有。 它依赖于已经从我的环境中移除了一些库,但我有一些存根库某处,它工作正常。 Id喜欢这个可执行文件指向这些存根库。 是的,我可以设置LD_LIBRARY_PATH,但这个可执行文件是由许多脚本调用,并且许多用户和我很想来修复它在一个地方。
我没有源出于此,并且将很难得到它。 我在想 - 我可以编辑这个文件,使用ELF的编辑器,并添加一个简单的路径为rpath有它击中了新的库? 这是可能的,或者一旦你创建一个ELF二进制,你解决事情的地点,他们可以不感动?
有一个工具,叫做chrpath
它可以做到这一点-它可能在你的发行版的封装。
还有一个更通用的工具比chrpath
称为patchelf
。 它最初创建用于制造包尼克斯和NixOS(包装系统和GNU / Linux发行版)。
但如果是在一个二进制文件(这里称为rdsamp)没有rpath的, chrpath
失败:
chrpath -r '$ORIGIN/../lib64' rdsamp
rdsamp: no rpath or runpath tag found.
另一方面,
patchelf --set-rpath '$ORIGIN/../lib64' rdsamp
成功就好了。
就像@ user7610说,走正道是patchelf
工具。
不过,我觉得我可以提供一个更全面的回答,覆盖需要做的正是所有的命令。
首先,许多开发商谈RPATH
,但实际上他们的意思RUNPATH
。 这是两个不同的可选的动态部分,并加载它们处理非常不同。 你可以阅读更多关于他们之间的差别在这里 。
现在,只需记住:
- 如果
RUNPATH
设置, RPATH
被忽略 -
RPATH
已被废弃,应避免 -
RUNPATH
是优选的,因为它可以通过被覆盖LD_LIBRARY_PATH
看到的当前R [UN] PATH
readelf -d <path-to-elf> | egrep "RPATH|RUNPATH"
清除将R [UN] PATH
patchelf --remove-rpath <path-to-elf>
笔记:
值添加至R [UN] PATH
patchelf [--force-rpath] --set-rpath "<desired-rpath>" <path-to-elf>
笔记:
-
<desired-path>
是逗号分隔的目录列表中,例如: /my/libs:/my/other/libs
- 如果指定
--force-rpath
,集RPATH
,否则设置RUNPATH
这为我工作,以$ ORIGIN更换XORIGIN。
chrpath -r '\$\ORIGIN/../lib64' httpd