リンクされたライブラリ(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
ここで、同じライブラリを必要とするがバージョンが異なる別のアプリケーション「bravo」、つまりで使用可能な(libz.so.1.2.8)を生成すると/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
、「bravo」が正常に起動します。上記の動作は、リンクライブラリのLD_LIBRARY_PATH
検索時にで定義されたディレクトリパスよりも優先され/etc/ld.so.conf
、その結果、上記のエラーが発生したためであると理解しています。ライブラリの最初のインスタンスが異なるバージョンである場合、UNIX / LINUXの開発者が階層に従って他のディレクトリ内のリンクされたライブラリを検索するようにOSを設計しなかった理由について、私はただ興味があります。
簡単に言えば、UNIX / LINUXシステムは、必要なライブラリが見つかるまで一連のディレクトリをトラバースします。しかし、バージョンに関係なく、ライブラリの最初のインスタンスを受け入れるのではなく、期待されるバージョンが見つかるまで同じことをしないのはなぜですか?
しかし、バージョンに関係なく、ライブラリの最初のインスタンスを受け入れるのではなく、期待されるバージョンが見つかるまで同じことをしないのはなぜですか?
それが知っている限り、それはします。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)
ですbravo
。)
これは簡単に修正できるはずだと思うかもしれませんが、そうではありません。バイナリとライブラリが必要なシンボルを必要なライブラリとは別にリストしているため、ローダーは特定のライブラリがすべてのシンボルを提供していることを確認できません。それから必要です。シンボルはさまざまな方法で提供でき、シンボルとそれらを提供するライブラリの間にリンクを導入すると、既存のバイナリが破損する可能性があります。物事を複雑にする(そしてセキュリティに敏感な開発者に髪を引き裂かせる)ためのシンボル介入の追加の楽しみもあります。
一部のライブラリは.gnu.version_r
、提供するライブラリへのリンクとともに、最終的にに格納されるバージョン情報を提供します。これは、ここで役立ちますが、libz
それらの1つではありません。
(sonamesを考えると、私はあなたの期待alpha
と仕事の罰金にバイナリをzlib.so.1.2.8
。)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加