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

标签 linux linker elf

我正在使用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/

相关文章:

c++ - 对 : dlopen, dlclose 的 undefined reference ,

linux - libelf 破坏 ARM elf 二进制文件

c++ - 如何在 Linux 架构上即时列出 C 代码中可用的所有函数/符号?

python-从逻辑路径获取物理磁盘信息

linux - 试运行一个有潜在危险的脚本?

linux - NodeJs 如何在控制台中显示表结构仪表板

linux - Linux 应用程序的虚拟地址重整

mysql - 如何分析MySQL Slow Query Log或MySQL General Query Log?

Linux opencv独立安装: not found in CMake

c++ - Xcode:为什么仅在静态库中重命名为 .mm 失败并出现 undefined symbol "___gxx_personality_sj0"?