実行可能ファイルのハードコーディングされた動的リンクの修正

実行可能ファイルのハードコーディングされた動的リンクの修正

登録する次の共有ライブラリの依存関係があります。

[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_予圧環境変数ですが、ライブラリはその特定の場所にまだ存在している必要があります。この問題を解決する方法はありますか?

ありがとうございます!

ベストアンサー1

私はあなたと同じバイナリを持っていませんが、いくつかのテストを行った結果、patchelfここではうまくいくようです。と依存関係を使用してhelloコンパイルされたバイナリがあります。-Wl,-rpath=/home/ja/c/hello-puts/make/liblibtest.so

$ 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)

私はpatchelf逃げる--make-needed-absolutepatchelfhttps://github.com/dezgeg/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)

running を試みて開始された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()

おすすめ記事