patchelf 将解释器设置为相对于可执行文件的路径

patchelf set interpreter to a path relative to executable

我试过这样做:

patchelf --set-interpreter ../lib/ld-linux-x86-64.so.2 "${APPDIR}/usr/bin/myapp"

所以我有这个:

readelf -l AppDir/usr/bin/myapp
...
[Requesting program interpreter: ../lib/ld-linux-x86-64.so.2]

但看起来它不喜欢相对路径,因为我收到错误:

$  AppDir/usr/bin/myapp 
bash: AppDir/usr/bin/myapp: No such file or directory

我发现了这个问题,因为我试图通过使用 $ORIGIN: 来解决这个问题,但它没有回答我的问题。

如果您无法事先知道其在机器上的绝对路径(例如,如果它是一个 appimage 案例),是否有一种简单的方法可以使用您的特定链接器修补可执行文件?我知道的唯一解决方法是使用 path/to/my/ld.so --library-path <path/to/my/libs> path/to/my/exe。但我很好奇,是否有办法真正修补可执行文件,以便我可以直接启动它?

您需要指定相对于当前工作目录(您用来执行程序的目录)的路径,而不是相对于包含二进制文件的目录。

echo 'int main() { return 0; }' > main.c
gcc -Wl,--dynamic-linker=./lib/ld-linux-x86-64.so.2 -o main main.c

mkdir bin
mkdir lib
cp /lib64/ld-linux-x86-64.so.2 lib/
cp main bin/

bin/main          # this should run without problems
cd bin; ./main    # this throws a "No such file or directory" error