リンクライブラリ(libz.so.1.2.7)が必要な「alpha」というバイナリ実行可能ファイルがあります。このファイルは次の場所にあります。/home/username/myproduct/lib/libz.so.1.2.7
次のコマンドを実行してバイナリ実行可能ファイルを生成する前に、ターミナルインスタンスにエクスポートしました。
export LD_LIBRARY_PATH=/home/username/myproduct/lib/:$LD_LIBRARY_PATH
同じライブラリが必要ですが、異なるバージョン(たとえば、で利用可能なlibz.so.1.2.8)を必要とする別のアプリケーション「bravo」を作成すると、システムは次の
/lib/x86_64-linux-gnu/libz.so.1.2.8
エラーをスローします。
version `ZLIB_1.2.3.3' not found (required by /usr/lib/x86_64-linux-gnu/libxml2.so.2)
設定を解除すると、LD_LIBRARY_PATH
「ブラボ」が正常に起動します。上記の動作は、定義LD_LIBRARY_PATH
されたディレクトリパスよりもリンクされたライブラリが優先的に検索されるため、上記のエラーが発生するためです。/etc/ld.so.conf
ライブラリの最初のインスタンスが異なるバージョンの場合、UNIX / LINUX開発者が階層に基づいて別のディレクトリにリンクされているライブラリを検索するようにオペレーティングシステムを設計していないのはなぜですか?
簡単に言えば、UNIX / LINUXシステムは、必要なライブラリが見つかるまで一連のディレクトリを探します。しかし、バージョンに関係なく、ライブラリの最初のインスタンスを受け入れるのではなく、期待されるバージョンが見つかるまで同じことをしないのはなぜですか?
答え1
しかし、バージョンに関係なく、ライブラリの最初のインスタンスを受け入れるのではなく、期待されるバージョンが見つかるまで同じことをしないのはなぜですか?
知っている限りそうです。zlib.so.1.2.7
どちらもzlib.so.1.2.8
sonameを持っているので、zlib.so.1
あなたalpha
とbravo
バイナリはそれが必要だと言いますzlib.so.1
。動的ローダーは、見つかった最初の一致ライブラリをロードします。バージョン 1.2.8 がbravo
必要な追加記号を提供していることを認識していません。 (これがディストリビューションがzlib1g (>= 1.2.8)
forなどの追加の依存関係情報を指定しようとする理由ですbravo
。)
この問題は修正しやすいと思うかもしれませんが、そうではありません。特に、バイナリとライブラリは、必要なライブラリとは別に必要なシンボルをリストするので、ローダは指定されたライブラリが必要なすべてのシンボルを提供するかどうかを判断できません。すべてはそれから得られるべきです。シンボルはさまざまな方法で提供でき、シンボルとそれを提供するライブラリ間のリンクを導入すると既存のバイナリが破損する可能性があります。シンボル挿入はまた楽しさを増し、物事を複雑にします(セキュリティに敏感な開発者を与える)。
.gnu.version_r
libz
一部のライブラリは、提供されたライブラリへのリンクとともに最終的に保存されるバージョン情報を提供します。
(sonameを考えると、alpha
バイナリがzlib.so.1.2.8
。