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
我试过这样做:
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