我有一个计划用于废料堆的旧可执行文件,但是还不存在。它依赖于已经从我的环境中删除的一些库,但是我在某些可以正常工作的地方有一些存根库。我想将此可执行文件指向这些存根库。是的,我可以设置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-dtags
set DT_RUNPATH
,这是大多数人应该使用的一种。RUNPATH
可以被覆盖LD_LIBRARY_PATH
,因此人们不应该使用--force-rpath
。
<desired-path>
使用冒号;它应该是逗号(即:)/my/libs,/my/other/libs
。