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

我正在使用patchelf修改rpath和已编译二进制文件的解释器.对patchelf的调用看起来像这样:

patchelf --set-interpreter "\$ORIGIN/lib/ld-linux-x86-64.so.2" --set-rpath "\$ORIGIN/lib" ./grep

通过运行readelf -l ./grep |进行验证,正确设置了这些grep解释器,输出:

[Requesting program interpreter: $ORIGIN/lib/ld-linux-x86-64.so.2]

但是,当我尝试运行可执行文件时,出现以下错误:

-bash: ./grep: No such file or directory

这似乎表明链接器存在问题.如果我指定一个绝对路径而不是使用$ORIGIN那么它似乎工作正常.

我想知道我在这里如何使用$ORIG这是不正确的,或者这可能是在系统级别可能被禁用的东西?

解决方法:

If I specify an absolute path instead of using $ORIGIN then it seems to work fine.

这是按预期工作的.

动态链接器解释(扩展)$ORIGIN和其他特殊标记.

Linux内核没有.

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

没有办法使解释器本身成为有效路径以外的任何东西.

根据您实际想要实现的目标,rtldi可能就是答案.

上一篇:【Unity Shaders】Reflecting Your World(反射吧!)介绍


下一篇:linux – 按需加载/卸载ELF部分?