web-dev-qa-db-ja.com

Unix / Linuxシステムが、リンクされたライブラリの必要なバージョンを見つけるまで、ディレクトリを走査しないのはなぜですか?

リンクされたライブラリ(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システムは、必要なライブラリが見つかるまで一連のディレクトリを走査します。しかし、バージョンに関係なく、ライブラリの最初のインスタンスを受け入れるのではなく、期待されるバージョンが見つかるまで、同じことをしないのはなぜですか?

17
daedalus_hamlet

しかし、バージョンに関係なく、ライブラリの最初のインスタンスを受け入れるのではなく、期待されるバージョンが見つかるまで、同じことをしないのはなぜですか?

知る限りではそうです。 _zlib.so.1.2.7_および_zlib.so.1.2.8_はどちらも_zlib.so.1_のsonameを持っているため、alphaおよびbravoバイナリは_zlib.so.1_が必要であると言います。ダイナミックローダーは、最初に一致したライブラリをロードします。バージョン1.2.8がbravoに必要な追加のシンボルを提供することを知りません。 (これが、ディストリビューションがbravozlib1g (>= 1.2.8)などの追加の依存関係情報を指定するのに苦労する理由です。)

これは簡単に修正できるはずだと思うかもしれませんが、特にそうではありません。バイナリとライブラリには、必要なライブラリとは別に必要なシンボルがリストされているため、ローダーは、特定のライブラリが提供するすべてのシンボルを提供しているかどうかを確認できませんそれから必要です。シンボルはさまざまな方法で提供でき、シンボルとライブラリの間にリンクを導入すると、既存のバイナリが破損する可能性があります。また、複雑化するために記号を挿入するという面白さも加わっています(セキュリティに敏感な開発者に髪の毛を引き裂かせます)。

一部のライブラリは、_.gnu.version_r_に格納されるバージョン情報を提供するライブラリへのリンクを提供しますが、ここでは役立ちますが、libzはそれらの1つではありません。

(sonamesを考慮して、alphaバイナリが_zlib.so.1.2.8_で正常に動作することを期待しています。)

28
Stephen Kitt