regという実行可能ファイルがあり、次の共有ライブラリの依存関係があります。
[terminal]$ ldd ./reg
linux-vdso.so.1 => (0x00007ffc40d90000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003be0c00000)
/usr/dep/packages/opt/intel/mkl/10.0.2.018/lib/em64t/libmkl_intel_lp64.so => not found
バイナリを実行すると、次のようになります。
[terminal]$ ./reg
./reg: error while loading shared libraries: /usr/dep/packages/opt/intel/mkl/10.0.2.018/lib/em64t/libmkl_intel_lp64.so: cannot open shared object file: No such file or directory.
問題は、指定されたディレクトリパスを作成し、そこにライブラリを配置する管理者権限がないことです。さらに、私はソースコードを持っていないので、それを再コンパイルすることもできませんが、libmkl_intel_lp64.soライブラリを別の場所に保存しています。 LD_PRELOAD環境変数を使用してみましたが、その特定の場所にそのライブラリが必要です。この問題をどのように解決できるかという解決策はありますか?
ありがとうございました!
私はあなたが持っているものと同じバイナリを持っていませんが、少しテストを行ったところ、patchelf
はここで機能するようです。依存関係として-Wl,-rpath=/home/ja/c/hello-puts/make/lib
およびlibtest.so
でコンパイルされたhello
バイナリがあります。
$ ldd hello
linux-vdso.so.1 (0x00007ffedb4f0000)
libtest.so => /home/ja/c/hello-puts/make/lib/libtest.so (0x00007f04a2437000)
libc.so.6 => /lib64/libc.so.6 (0x00007f04a200f000)
/lib64/ld-linux-x86-64.so.2 (0x0000564a42e36000)
https://github.com/dezgeg/patchelf/ からpatchelf
を使用して--make-needed-absolute
でpatchelf
を実行します。
$ patchelf --make-needed-absolute hello
$ ldd hello
linux-vdso.so.1 (0x00007fff9baa3000)
/home/ja/c/hello-puts/make/lib/libtest.so (0x00007f81bd0e2000)
libc.so.6 => /lib64/libc.so.6 (0x00007f81bccba000)
/lib64/ld-linux-x86-64.so.2 (0x0000556714bb5000)
それがあなたの持っているものだと思います。私はhello
を他のマシンにコピーしました:
$ ldd ./hello
linux-vdso.so.1 => (0x00007fff92e7d000)
/home/ja/c/hello-puts/make/lib/libtest.so => not found
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ff381c9b000)
/lib64/ld-linux-x86-64.so.2 (0x00007ff382065000)
最初に、必要なlibtest.so
依存関係を削除しました。
$ patchelf --remove-needed /home/ja/c/hello-puts/make/lib/libtest.so hello
$ ldd hello
linux-vdso.so.1 => (0x00007ffdcedfb000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f60705c5000)
/lib64/ld-linux-x86-64.so.2 (0x00007f607098f000)
hello
を実行しようとしましたが、開始されましたが、インタープリターによって行われた遅延バインディングのため、予期される出力の最初の行のみが表示されました。
$ ./hello
hello world
./hello: symbol lookup error: ./hello: undefined symbol: foo
libtest.so
を再度追加しましたが、絶対パスはありません。
$ patchelf --add-needed libtest.so hello
$ ldd hello
linux-vdso.so.1 => (0x00007ffda155c000)
libtest.so => not found
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ffbdb8c3000)
/lib64/ld-linux-x86-64.so.2 (0x00007ffbdbc8d000)
libtest.so
を$PWD
にコピーし、hello
を開始できました。
$ LD_LIBRARY_PATH=. ./hello
hello world
inside foo()