web-dev-qa-db-ja.com

特定の実行可能ファイル(CentOs 6)のリンクライブラリを変更する

次のようにリンクされた実行可能ファイルがあります。

  $ ldd a.out
        libboost_system-mt.so.1.47.0 => /usr/lib64/libboost_system-mt.so.1.47.0 (0x00007f4881f56000)
        libssl.so.10 => /usr/lib64/libssl.so.10 (0x00007f4881cfb000)
        libcrypto.so.10 => /usr/lib64/libcrypto.so.10 (0x00007f4881965000)
        librt.so.1 => /lib64/librt.so.1 (0x00007f488175d000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f4881540000)
        libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007f4881239000)
.
.

Libcryptoおよびlibsslライブラリはopenssl 1.0.0-fips libsです。代わりに1.0.1ライブラリを試したいので、ホームディレクトリにビルドしました。 a.outを使用して、新しいopensslライブラリに大きな負担をかけずに再リンクする方法はありますか?避けたい

  • a.outを再リンクする必要がある(ビルドツールは非常に複雑なため)
  • グローバル設定の変更(他の開発者がこのマシンで動作するため)

私がここで望んでいることをすることは可能ですか?

29
Fixee

この特定の実行を一時的に別のライブラリに置き換えることができます。 Linuxでは、環境変数LD_LIBRARY_PATHは、コロンで区切られたディレクトリのセットであり、標準のディレクトリのセットの前にライブラリを最初に検索する必要があります。これは、新しいライブラリをデバッグするとき、または特別な目的で非標準のライブラリを使用するときに役立ちます。環境変数LD_PRELOADは、/ etc/ld.so.preloadと同様に、標準セットをオーバーライドする関数を含む共有ライブラリをリストします。 - 共有ライブラリ

ローダーを直接呼び出すこともできます。

/lib/ld-linux.so.2 --library-path pathexecutable

22
David Schwartz

LD_LIBRARY_PATH環境変数を設定するラッパースクリプトを記述します。これは、共有ライブラリ用のPATHのペンダントです。システム検索パスは、常に$LD_LIBRARY_PATHにリストされているディレクトリの後に検索されます。参考として ダイナミックリンカーマニュアル を参照してください。

#!/bin/sh
export LD_LIBRARY_PATH=~/opt/openssl-1.0.1/lib
exec /path/to/a.out "$@"

または、1回限りの場合は、コマンドラインで直接:

LD_LIBRARY_PATH=~/opt/openssl-1.0.1/lib ./a.out

または、バイナリを変更する場合は、 chrpath を試してください。これにより、実行可能ファイルに組み込まれたライブラリ検索パスを編集できます。