我有一个计划用于废料堆的旧可执行文件,但是还不存在。它依赖于已经从我的环境中删除的一些库,但是我在某些可以正常工作的地方有一些存根库。我想将此可执行文件指向这些存根库。是的,我可以设置LD_LIBRARY_PATH,但是许多脚本都调用了此可执行文件,许多用户也希望将其修复在一个位置。
我没有这个来源,很难得到它。我当时在想-是否可以使用支持ELF的编辑器来编辑此文件,并向rpath添加一个简单的PATH使其进入新库?这是否可能,或者一旦创建了ELF二进制文件,便将其固定在位置上并且无法移动?
我有一个计划用于废料堆的旧可执行文件,但是还不存在。它依赖于已经从我的环境中删除的一些库,但是我在某些可以正常工作的地方有一些存根库。我想将此可执行文件指向这些存根库。是的,我可以设置LD_LIBRARY_PATH,但是许多脚本都调用了此可执行文件,许多用户也希望将其修复在一个位置。
我没有这个来源,很难得到它。我当时在想-是否可以使用支持ELF的编辑器来编辑此文件,并向rpath添加一个简单的PATH使其进入新库?这是否可能,或者一旦创建了ELF二进制文件,便将其固定在位置上并且无法移动?
Answers:
有一个名为的工具chrpath可以执行此操作-您的发行版软件包中可能提供了该工具。
install_name_tool可以用该-rpath标记进行操作
<binary>: no rpath or runpath tag found.,您不能使用chrpath它来代替它,但是patchelf在这种情况下,您可以使用:patchelf --set-rpath /path/to/libaries <binary>
有一个比chrpath称为的通用工具patchelf。它最初是为制作用于Nix和NixOS的软件包(包装系统和GNU / Linux发行版)而创建的。
如果二进制文件(这里称为rdsamp)中没有rpath,则会chrpath失败:
chrpath -r '$ORIGIN/../lib64' rdsamp
rdsamp: no rpath or runpath tag found.
另一方面,
patchelf --set-rpath '$ORIGIN/../lib64' rdsamp
成功就好。
patchelf能够将rpath添加到不包含rpath的二进制文件中- chrpath似乎只能修改已经存在的条目。
rpath和之间的细微区别runpath。基本上,一个可以覆盖LD_LIBRARY_PATH而另一个不能覆盖。有关详细信息,请参见blog.tremily.us/posts/rpath
chrpath和patchelf它们的术语都草率。例如,patchelf上面显示的命令将更改,runpath但rpath除非您也提供该--force-rpath选项,否则不会更改。
patchelf了解释:“ --set-rpath,--shrink-rpath并且--print-rpath现在 优先DT_RUNPATH于DT_RPATH,它已过时。更新时,如果两个都存在,则两个都被更新。如果仅存在DT_RPATH,则将其转换为,DT_RUNPATH除非--force-rpath指定。如果都不存在,DT_RUNPATH除非--force-rpath指定,否则添加a ,在这种情况下,将DT_RPATH添加a。” 出于兼容性原因,该选项的名称可能保持不变。
就像@ 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>
笔记:
RPATH和RUNPATH将值添加到R [UN] PATH
patchelf [--force-rpath] --set-rpath "<desired-rpath>" <path-to-elf>
笔记:
<desired-path> 是用逗号分隔的目录列表,例如: /my/libs:/my/other/libs--force-rpath,则设置RPATH,否则设置RUNPATH-Wl,-R,<desired-rpath> -Wl,--enable-new-dtagsset DT_RUNPATH,这是大多数人应该使用的一种。RUNPATH可以被覆盖LD_LIBRARY_PATH,因此人们不应该使用--force-rpath。
<desired-path>使用冒号;它应该是逗号(即:)/my/libs,/my/other/libs。