Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

17.2. soname のメカニズム

動的に読み込まれたライブラリー (共有オブジェクト) は、soname というメカニズムを使用して、複数の互換性のあるバージョンのライブラリーを管理します。

前提条件

問題の概要

動的に読み込んだライブラリー (共有オブジェクト) は、独立した実行可能ファイルとして存在します。そのため、依存するアプリケーションを更新せずに、ライブラリーを更新できます。ただし、この概念に関連して以下の問題が生じます。

  • ライブラリーの実際のバージョンを特定すること
  • 同じライブラリーの複数のバージョンを存在させる必要があること
  • 複数のバージョンでそれぞれ ABI の互換性を示す

soname のメカニズム

この問題を解決するには、Linux では soname というメカニズムを使用します。

ライブラリー fooX.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 は、検査するライブラリーの実際のファイル名に置き換えます。