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


29

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

  $ 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(ビルドツールは非常に複雑であるため)
  • グローバル設定の変更(他の開発者がこのマシンで動作するため)

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

回答:


22

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

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

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


1
LD_LIBRARY_PATHはデフォルトの検索パスを上書きしません。私はそれを設定しましたが、lddはオーバーライドされたパスではなく、システムのデフォルトパスを表示し続けます。LD_PRELOADを設定することで、自分のライブラリを強制的にロードできますが。
カルマリオ

18

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を試してください。これにより、実行可能ファイルにベイクされたライブラリ検索パスを編集できます。


2
+1 chrpath。まさに私が必要なもの。
Raghav RV

かわいい話、Microsoftはこれをグーグルで2分間過ごすには愚かすぎて、SQL Serverをopenss-1.0.0に明示的にリンクしたり、openssl.so blogs.msdn.microsoft.com/sql_server_teamの
エヴァンキャロル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.