/bin/cat
次の共有ライブラリを使用する実行可能ファイルがあるとします。
linux-vdso.so.1
libc.so.6
/lib64/ld-linux-x86-64.so.2
これらのものを何とか一緒に「結合」することは可能ですか(実行可能なアーカイブまたは同様のもの)。
これを実行したいプログラムのコードがないため、-staticフラグを使用してコンパイルすることはできません。
ベストアンサー1
システムの場所にあるすべてのライブラリを実行可能ファイルのあるサブディレクトリにコピーして使用できます。パヘルフ、実行可能ファイルがシステムのlibディレクトリではなく、その場所でlibの依存関係を見つけるようにします。
たとえば、
相対化ライブラリ:
#!/bin/bash -e
[ -n "$1" ] || set -- a.out
mkdir -p ./lib/ #<copy the libraries here
#use ldd to resolve the libs and use `patchelf --print-needed to filter out
# "magic" libs kernel-interfacing libs such as linux-vdso.so, ld-linux-x86-65.so or libpthread
# which you probably should not relativize anyway
join \
<(ldd "$1" |awk '{if(substr($3,0,1)=="/") print $1,$3}' |sort) \
<(patchelf --print-needed "$1" |sort) |cut -d\ -f2 |
#copy the lib selection to ./lib
xargs -d '\n' -I{} cp --copy-contents {} ./lib
#make the relative lib paths override the system lib path
patchelf --set-rpath "\$ORIGIN/lib" "$1"
LD_LIBRARY_PATH
(ハッキングとは異なり、これはsetuid実行可能ファイルでも機能する必要があると思います。)
./lib
その後、実行可能ファイルと一緒にディレクトリを移動するだけです。