我可以改变“rpath的”在已编译的二进制?(Can I change 'rpath'

2019-06-21 18:20发布

我的影片定于垃圾堆的旧可执行文件,但它现在还没有。 它依赖于已经从我的环境中移除了一些库,但我有一些存根库某处,它工作正常。 Id喜欢这个可执行文件指向这些存根库。 是的,我可以设置LD_LIBRARY_PATH,但这个可执行文件是由许多脚本调用,并且许多用户和我很想来修复它在一个地方。

我没有源出于此,并且将很难得到它。 我在想 - 我可以编辑这个文件,使用ELF的编辑器,并添加一个简单的路径为rpath有它击中了新的库? 这是可能的,或者一旦你创建一个ELF二进制,你解决事情的地点,他们可以不感动?

Answer 1:

有一个工具,叫做chrpath它可以做到这一点-它可能在你的发行版的封装。



Answer 2:

还有一个更通用的工具比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

成功就好了。



Answer 3:

就像@ 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>

笔记:

  • 同时删除RPATHRUNPATH

值添加至R [UN] PATH

patchelf [--force-rpath] --set-rpath "<desired-rpath>" <path-to-elf>

笔记:

  • <desired-path>是逗号分隔的目录列表中,例如: /my/libs:/my/other/libs
  • 如果指定--force-rpath ,集RPATH ,否则设置RUNPATH


Answer 4:

这为我工作,以$ ORIGIN更换XORIGIN。

chrpath -r '\$\ORIGIN/../lib64' httpd



文章来源: Can I change 'rpath' in an already compiled binary?
标签: linux linker elf