使用 $ORIGIN 指定 ELF 二进制文件中的解释器不起作用

2023-11-25

我在用着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在这里,或者这可能是在系统级别上被禁用的东西?


如果我指定绝对路径而不是使用 $ORIGIN 那么它似乎工作正常。

这正在按预期工作。

它是解释(扩展)的动态链接器$ORIGIN以及其他特殊的代币。

Linux 内核doesn't.

这是内核读取的PT_INTERP主可执行文件的段(如果存在)加载并调用解释器(动态链接器)。当您将解释器设置为不存在的路径时(例如$ORIGIN/lib/ld-linux-x86-64.so.2), 你得到ENOENT从内核execve系统调用。

没有办法让解释器本身成为有效路径之外的任何东西。

取决于你是什么actually试图实现,rtldi也许就是答案。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 $ORIGIN 指定 ELF 二进制文件中的解释器不起作用 的相关文章

随机推荐

Powered by Hwhale