実際、正しく実行されていれば、複数のバージョンの共有ライブラリをインストールできます。
共有ライブラリは通常、次のように命名されます。
lib<name>.so.<api-version>.<minor>
次に、以下の名前でライブラリへのシンボリックリンクがあります。
lib<name>.so
lib<name>.so.<api-version>
開発者がライブラリをリンクしてバイナリを生成する場合.so
、リンカが検出するのはファイル名です。実際、一度にインストールできるのは1つ<name>
だけですが、これは、開発者が複数の異なるバージョンのライブラリを同時に対象にできないことを意味します。パッケージマネージャーでは、この.so
シンボリックリンクは、-dev
開発者のみがインストールする必要がある別のパッケージの一部です。
リンカが末尾が名前のファイルを見つけて.so
使用すると、そのライブラリ内でsonameというフィールドを探します。sonameは、生成されるバイナリに埋め込むファイル名をリンカーに通知し、実行時にどのファイル名を探すかを通知します。sonameはに設定されることになっていますlib<name>.so.<api-version>
。
したがって、実行時に、動的リンカーはそれを探しlib<name>.so.<api-version>
て使用します。
意図は次のとおりです。
<minor>
アップグレードによってライブラリのAPIが変更されることはなく、<minor>
がより高いバージョンに変更された場合、すべてのバイナリを新しいバージョンにアップグレードしても安全です。バイナリはすべてlib<name>.so.<api-version>
、最新のへのシンボリックリンクであるという名前でライブラリを探してlib<name>.so.<api-version>.<minor>
いるため、アップグレードされます。
<api-version>
アップグレードによってライブラリのAPIが変更されるため、既存のバイナリアプリケーションに新しいバージョンを使用させるのは安全ではありません。<api-version>
が変更された場合、これらのアプリケーションは名前を探しているlib<name>.so.<api-version>
が、の値が異なるため<api-version>
、新しいバージョンは取得されません。
ライブラリを使用するすべてのバイナリを含むディストリビューション全体は通常、配布前にすべてのライブラリの一貫したバージョンを使用するようにコンパイルされるため、パッケージマネージャーは同じ配布バージョン内の同じライブラリの複数のバージョンをパッケージ化しないことがよくあります。リリースされました。すべてに一貫性があり、ディストリビューションのすべてが他のすべてと互換性があることを確認することは、ディストリビューターのワークロードの大きな部分です。
ただし、システムをディストリビューションのあるバージョンから別のバージョンにアップグレードしても、古いライブラリバージョンを必要とする古いパッケージがいくつかある場合は、簡単にライブラリの複数のバージョンになる可能性があります。例:
- 古いDebianのlibmysqlclient16には
libmysqlclient.so.16.0.0
、symlink が含まれていますlibmysqlclient.so.16
。
- 現在のDebianのlibmysqlclient18には
libmysqlclient.so.18.0.0
、symlink が含まれていますlibmysqlclient.so.18
。