我正在使用patchelf修改 rpath 和已编译二进制文件的解释器。对 patchelf 的调用如下所示:
patchelf --set-interpreter "\$ORIGIN/lib/ld-linux-x86-64.so.2" --set-rpath "\$ORIGIN/lib" ./grep
这些设置正确,通过运行 readelf -l ./grep | grep interpreter
进行验证。 ,输出:
[Requesting program interpreter: $ORIGIN/lib/ld-linux-x86-64.so.2]
但是,当我尝试运行可执行文件时,出现以下错误:
-bash: ./grep: No such file or directory
这似乎表明链接器存在问题。如果我指定绝对路径而不是使用 $ORIGIN
那么它似乎工作正常。
我想知道我的使用方式是否有问题 $ORIGIN
在这里,或者这可能是在系统级别上被禁用的东西?
最佳答案
If I specify an absolute path instead of using $ORIGIN then it seems to work fine.
这正在按预期工作。
它是解释(扩展)$ORIGIN
的动态链接器和其他特殊 token 。
Linux 内核没有。
内核读取 PT_INTERP
主可执行文件的段(如果存在)加载并调用解释器(动态链接器)。当您将解释器设置为不存在的路径(例如 $ORIGIN/lib/ld-linux-x86-64.so.2
)时,您会得到 ENOENT
来自内核execve
系统调用。
没有办法让解释器本身成为有效路径之外的任何东西。
根据您实际想要实现的目标,rtldi也许就是答案。
关于linux - 使用 $ORIGIN 指定 ELF 二进制文件中的解释器不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48452793/