使用 $ORIGIN 指定 ELF 二进制文件中的解释器不起作用
Using $ORIGIN to specify the interpreter in ELF binaries isn't working
我正在使用 patchelf 修改 rpath 和已编译二进制文件的解释器。对 patchelf 的调用看起来像这样:
patchelf --set-interpreter "$ORIGIN/lib/ld-linux-x86-64.so.2" --set-rpath "$ORIGIN/lib" ./grep
这些设置正确,由 运行ning 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
和其他特殊标记的是动态链接器。
Linux内核不会。
内核读取主要可执行文件的 PT_INTERP
段并(如果存在)加载和调用解释器(动态链接器)。当您将解释器设置为不存在的路径(例如 $ORIGIN/lib/ld-linux-x86-64.so.2
)时,您会从内核 execve
系统调用中获得 ENOENT
。
没有办法让解释器本身成为有效路径以外的任何东西。
取决于您实际想要达到的目标,rtldi可能就是答案。
我正在使用 patchelf 修改 rpath 和已编译二进制文件的解释器。对 patchelf 的调用看起来像这样:
patchelf --set-interpreter "$ORIGIN/lib/ld-linux-x86-64.so.2" --set-rpath "$ORIGIN/lib" ./grep
这些设置正确,由 运行ning 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
和其他特殊标记的是动态链接器。
Linux内核不会。
内核读取主要可执行文件的 PT_INTERP
段并(如果存在)加载和调用解释器(动态链接器)。当您将解释器设置为不存在的路径(例如 $ORIGIN/lib/ld-linux-x86-64.so.2
)时,您会从内核 execve
系统调用中获得 ENOENT
。
没有办法让解释器本身成为有效路径以外的任何东西。
取决于您实际想要达到的目标,rtldi可能就是答案。