17.2. soname のメカニズム
動的に読み込まれたライブラリー (共有オブジェクト) は、soname というメカニズムを使用して、複数の互換性のあるバージョンのライブラリーを管理します。
前提条件
- 動的リンクとライブラリーについて理解している
- ABI の互換性の概念を理解している
- ライブラリーの命名規則を理解している
- シンボリックリンクを理解している
問題の概要
動的に読み込んだライブラリー (共有オブジェクト) は、独立した実行可能ファイルとして存在します。そのため、依存するアプリケーションを更新せずに、ライブラリーを更新できます。ただし、この概念に関連して以下の問題が生じます。
- ライブラリーの実際のバージョンを特定すること
- 同じライブラリーの複数のバージョンを存在させる必要があること
- 複数のバージョンでそれぞれ ABI の互換性を示す
soname のメカニズム
この問題を解決するには、Linux では soname というメカニズムを使用します。
ライブラリー foo
の X.Y バージョンは、バージョン番号に同じ値 X を持つ他のバージョンと ABI の互換性があります。互換性を確保してマイナーな変更を加えると、Y の数が増えます。互換性がなくなるようなメジャーな変更を加えると、X の数が増えます。
実際のライブラリー foo
のバージョン X.Y は、libfoo.so.x.y
ファイルとして存在します。ライブラリーファイルの中に、soname が libfoo.so.x
の値として記録され、互換性を指定します。
アプリケーションが構築されると、リンカーが libfoo.so
ファイルを検索してライブラリーを特定します。この名前のシンボリックリンクが存在し、実際のライブラリーファイルを参照している必要があります。次にリンカーは、ライブラリーファイルから soname を読み込み、これをアプリケーションの実行可能ファイルに記録します。最後に、リンカーにより、名前またはファイル名でなく、soname を使用してライブラリーで依存関係を宣言するようにアプリケーションが作成されます。
ランタイムの動的リンカーが実行前にアプリケーションをリンクすると、soname がアプリケーションの実行可能ファイルから読み込まれます。この soname は libfoo.so.x
です。この名前のシンボリックリンクが存在し、実際のライブラリーファイルを参照している必要があります。soname が変更されないため、これにより、バージョンの Y コンポーネントに関係なく、ライブラリーを読み込むことができます。
バージョン番号の Y の部分は、単一の数字に制限される訳ではありません。また、ライブラリーによっては、バージョンを名前にエンコードするものもあります。
ファイルからの soname の読み込み
somelibrary
ライブラリーファイルの soname を表示するには、以下を実行します。
$ objdump -p somelibrary | grep SONAME
somelibrary は、検査するライブラリーの実際のファイル名に置き換えます。