リンクされたライブラリ(libz.so.1.2.7)が/home/username/myproduct/lib/libz.so.1.2.7
にある「alpha」という名前のバイナリ実行可能ファイルがあります。
次のコマンドを実行してバイナリ実行可能ファイルを生成する前に、同じものをターミナルインスタンスにエクスポートします。
export LD_LIBRARY_PATH=/home/username/myproduct/lib/:$LD_LIBRARY_PATH
ここで、同じライブラリを必要とするがバージョンが異なる別のアプリケーション「bravo」、つまり/lib/x86_64-linux-gnu/libz.so.1.2.8
で利用できる(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
の設定を解除すると、「bravo」が正常に起動します。上記の動作は、リンクされたライブラリを検索しているときにLD_LIBRARY_PATH
が/etc/ld.so.conf
で定義されたディレクトリパスよりも優先されるため、上記のエラーが発生したことを理解しています。ライブラリの最初のインスタンスが異なるバージョンである場合、UNIX/LINUXの開発者が階層に従ってリンクされたライブラリを他のディレクトリで検索するようにOSを設計していないのはなぜですか。
簡単に言うと、UNIX/LINUXシステムは、必要なライブラリが見つかるまで一連のディレクトリを走査します。しかし、バージョンに関係なく、ライブラリの最初のインスタンスを受け入れるのではなく、期待されるバージョンが見つかるまで、同じことをしないのはなぜですか?
しかし、バージョンに関係なく、ライブラリの最初のインスタンスを受け入れるのではなく、期待されるバージョンが見つかるまで、同じことをしないのはなぜですか?
知る限りではそうです。 _zlib.so.1.2.7
_および_zlib.so.1.2.8
_はどちらも_zlib.so.1
_のsonameを持っているため、alpha
およびbravo
バイナリは_zlib.so.1
_が必要であると言います。ダイナミックローダーは、最初に一致したライブラリをロードします。バージョン1.2.8がbravo
に必要な追加のシンボルを提供することを知りません。 (これが、ディストリビューションがbravo
のzlib1g (>= 1.2.8)
などの追加の依存関係情報を指定するのに苦労する理由です。)
これは簡単に修正できるはずだと思うかもしれませんが、特にそうではありません。バイナリとライブラリには、必要なライブラリとは別に必要なシンボルがリストされているため、ローダーは、特定のライブラリが提供するすべてのシンボルを提供しているかどうかを確認できませんそれから必要です。シンボルはさまざまな方法で提供でき、シンボルとライブラリの間にリンクを導入すると、既存のバイナリが破損する可能性があります。また、複雑化するために記号を挿入するという面白さも加わっています(セキュリティに敏感な開発者に髪の毛を引き裂かせます)。
一部のライブラリは、_.gnu.version_r
_に格納されるバージョン情報を提供するライブラリへのリンクを提供しますが、ここでは役立ちますが、libz
はそれらの1つではありません。
(sonamesを考慮して、alpha
バイナリが_zlib.so.1.2.8
_で正常に動作することを期待しています。)