soname は、ライブラリがサポートするバイナリ API の互換性を示すために使用されます。
SONAME
リンカーによってコンパイル時に使用され、ライブラリ ファイルから実際のターゲット ライブラリのバージョンが決定されます。gcc -lNAME
は lib .so リンクまたはファイルを探し、NAME
その SONAME をキャプチャします。これはより具体的です (例 libnuke.so は SONAME libnuke.so.0 を含む libnuke.so.0.1.4 にリンクしています)。
実行時にこれとリンクされ、ELF 動的セクションNEEDED
に設定されます。次に、この名前のライブラリ (またはそれへのリンク) が存在する必要があります。実行時SONAME
は無視されるので、リンクまたはファイルの存在だけで十分です。
注意: SONAME はリンク/ビルド時にのみ適用され、実行時には適用されません。
ライブラリの「SONAME」は、「objdump -p file |grep SONAME」で確認できます。バイナリの「NEEDED」は、「objdump -p file |grep NEEDED」で確認できます。
[編集] 警告 以下は一般的な意見であり、Linux に展開されたものではありません。最後に見てください。
libnuke.so.1.2 という名前のライブラリがあり、新しい libnuke ライブラリを開発するとします。
- 新しいライブラリが API の変更を伴わない以前の修正である場合は、同じ soname を維持し、ファイル名のバージョンを増やす必要があります。つまり、ファイルは libnuke.so.1.2.1 になりますが、soname は libnuke.so.1.2 のままです。
- 新しい機能を追加しただけで機能を壊さず、以前と互換性がある新しいライブラリがある場合は、以前と同じ soname に加えて .1 のような新しいサフィックスを使用したいと考えています。つまり、ファイルと soname は libnuke.so.1.2.1 になります。libnuke.1.2 にリンクされたプログラムは、そのプログラムでも動作します。libnuke.1.2.1 にリンクされた新しいプログラムは、そのプログラムでのみ動作します (新しいサブバージョンが libnuke.1.2.1.1 のようになるまで)。
- 新しいライブラリが libnuke と互換性がない場合: libnuke.so.2
- 新しいライブラリが裸の古いバージョンと互換性がある場合: libnuke.so.1.3 [つまり、libnuke.so.1 と互換性があります]
[編集] 完了: Linux ケース。
Linux の実際の SONAME では、特定の形式として : lib[NAME][API-VERSION].so.[major-version] major-version は、主要なライブラリの変更ごとに増加する 1 つの整数値のみです。API-VERSION はデフォルトで空です
ex libnuke.so.0
次に、実際のファイル名にはマイナー バージョンとサブバージョンが含まれます。例: libnuke.so.0.1.5
ファイルの名前を変更すると動作が変わるため、sonameを提供しないことは悪い習慣だと思います。