我有一个旧的可执行文件,它被安排在废料堆中,但它还没有.它依赖于从我的环境中删除的一些库,但我在某些地方工作正常.我想将此可执行文件指向这些存根库.是的,我可以设置LD_LIBRARY_PATH,但是这个可执行文件是从许多脚本中调用的,很多用户和我都喜欢在一个地方修复它.
我没有这方面的来源,并且很难得到它.我在想 - 我可以使用ELF识别编辑器编辑这个文件,并在rpath中添加一个简单的PATH以使其命中新的库吗?这是可能的,或者一旦你创建了一个ELF二进制文件,你就把东西固定到位置并且它们不能移动?
use*_*610 141
有一个比chrpath被称为更普遍的工具patchelf.它最初是为Nix和NixOS(包装系统和GNU/Linux发行版)制作软件包而创建的.
如果二进制文件中没有rpath(这里称为rdsamp),则chrpath失败:
chrpath -r '$ORIGIN/../lib64' rdsamp
rdsamp: no rpath or runpath tag found.
Run Code Online (Sandbox Code Playgroud)
另一方面,
patchelf --set-rpath '$ORIGIN/../lib64' rdsamp
Run Code Online (Sandbox Code Playgroud)
成功就好了.
Tom*_*omH 69
有一个工具叫做chrpath可以做到这一点 - 它可能在您的发行版的包中可用.
就像@ user7610所说的那样,正确的方法就是使用该patchelf工具。
但是,我觉得我可以给出一个更全面的答案,涵盖一个人确切要做的所有命令。
有关此主题的全面文章,请单击此处
首先,许多开发人员都在谈论RPATH,但实际上是他们的意思RUNPATH。这是两个不同的可选动态部分,加载器对它们的处理方式非常不同。您可以在我之前提到的链接中了解有关它们之间区别的更多信息。
现在,请记住:
RUNPATH设置,将RPATH被忽略RPATH 已弃用,应避免使用RUNPATH 首选,因为它可以被 LD_LIBRARY_PATH查看当前的R [UN] PATH
readelf -d <path-to-elf> | egrep "RPATH|RUNPATH"
Run Code Online (Sandbox Code Playgroud)
清除R [UN] PATH
patchelf --remove-rpath <path-to-elf>
Run Code Online (Sandbox Code Playgroud)
笔记:
RPATH和RUNPATH将值添加到R [UN] PATH
patchelf [--force-rpath] --set-rpath "<desired-rpath>" <path-to-elf>
Run Code Online (Sandbox Code Playgroud)
笔记:
<desired-path> 是用逗号分隔的目录列表,例如: /my/libs:/my/other/libs--force-rpath,则设置RPATH,否则设置RUNPATH