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


17

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


よくわかりませんが、セキュリティのためだと思います。個人的には、マシン上のどこにでもシンボリックリンクを心配する必要はありません
Joe

@Joeライブラリ自体の多くには、それらを指すシンボリックリンクがあります。libz.so.1へのシンボリックリンクですlibz.so.1.2.8
ナシルライリー

回答:


28

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

それが知っている限り、そうします。zlib.so.1.2.7そしてzlib.so.1.2.8両方のsonameがzlib.so.1あるので、あなたalphabravoバイナリは彼らが必要と言うzlib.so.1。ダイナミックローダーは、最初に見つかった一致するライブラリをロードします。バージョン1.2.8がbravo必要な追加のシンボルを提供することを知りません。(これが、のような追加の依存情報を指定するのに苦労する理由zlib1g (>= 1.2.8)ですbravo。)

これは簡単に修正できると思うかもしれませんが、それはそうではありません。特に、バイナリとライブラリは必要なライブラリとは別に必要なシンボルをリストするため、ローダーは特定のライブラリが提供するすべてのシンボルを提供することをチェックできませんそれから必要です。シンボルはさまざまな方法で提供でき、シンボルとそれらを提供するライブラリとの間にリンクを導入すると、既存のバイナリが破損する可能性があります。また、物事を複雑にする(そしてセキュリティに敏感な開発者が髪を引き裂くようにする)シンボル挿入の追加の楽しみがあります。

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

(sonamesを考えると、あなたのalphaバイナリがでうまく動くと思いますzlib.so.1.2.8。)


また、GNUスタイルのライブラリバージョン管理は、私たちが最も慣れているセマンティック(-ish)バージョン管理とは異なることに注意する必要があります。それらは同じ「現在の」番号1を持っているので、zlib.so.1.2.8はzlib.so.1.2.7が提供しない機能を提供するべきではありません。見つかりました。それが重要であることは欠陥とみなされるべきです。
ジョンボリンジャー

4
@Johnいいえ、唯一の保証は、同じsonameのライブラリが後方互換であることです。新しいライブラリは機能を追加できますが、後方互換性のない方法で削除または変更することはできません。つまり、zlib 1.2.7に対してビルドされたバイナリは、それ以降のzlib 1で動作します。;しかし、zlibの1.2.8に対して構築されたバイナリは意志古いzlibの1とは限らない仕事(SONAME処理がセマンティックバージョニングではなく、そしてセマンティックバージョニングがあることができます。)
スティーブン・キット

1
私が言ったように、GNU規約について具体的に話しているのですが、特にlibtoolについて推測しています。すべてのプロジェクトがその規則に従っているわけではないので、おそらくzlibに欠陥があると呼ぶには強すぎるかもしれませんが、一方で、関係するライブラリのバージョン番号の意味バージョン管理解釈でさえ同じ結論に達します。転送するような場合に(バイナリ)の相溶性がSONAMEに固有の約束ではないが、それはある。この場合に合理的な期待。
ジョンボリンジャー

1
はい、CRA番号とSOVERSIONの関係をよく理解しています。これは、元のポイントに戻ります。OPによって記述された状況は、CRAスキームの正しい使用法と矛盾しているようです。OPのような問題を回避することは、このスキームの重要な目的の1つです。zlibが新しい(バージョンの)バイナリインターフェイスを追加する場合、そのC番号を増やす必要があります。そのような隆起が転向隆起にもつながる可能性があることは二次的です。
ジョンボリンジャー

2
@ジョンは正しい、私たちは暴力的な合意にあり、あなたが言っていた点を誤解したと思う。とにかくzlib使用しませlibtoolん。ただし、Darwinの場合はar;-)です。
スティーブンキット
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.