64

「 Program Library HOWTO 」を学びました。soname次のようにバージョンを管理するために使用することが記載されています。

gcc -shared -fPIC -Wl,-soname,libfoo.so.1  -o libfoo.so.1.0.0 foo.c
ln -s libfoo.so.1.0.0  libfoo.so.1
ln -s libfoo.so.1 libfoo.so

が設定されていない場合は、という情報を取得しますsoname。libfoo.so.1.0.0 と等しくなります。ここからの回答を参照してください。

そして、次のように soname なしでも機能することがわかりました

 gcc -shared -fPIC -o libfoo.so.1.0.0 foo.c
 ln -s libfoo.so.1.0.0  libfoo.so.1
 ln -s libfoo.so.1 libfoo.so

したがって、唯一の便利な点は、コマンドをsoname使用して共有ライブラリを確認するときに、オプションが共有ライブラリのバージョンを教えてくれることだと思います。readelf -d libfoo.so

他に何ができますか?

4

5 に答える 5

64

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を提供しないことは悪い習慣だと思います。

于 2013-01-30T20:56:05.503 に答える
4

libA.so が libB.so に依存していて、それらはすべてディレクトリ内にあると仮定しましょう (もちろん、ディレクトリはダイナミック リンカでは見つかりません)。soname 設定しなかった場合はdlopen機能しません:

auto pB = dlopen("./libB.so", RTLD_LAZY | RTLD_GLOBAL);
auto pA = dlopen("./libA.so", RTLD_LAZY | RTLD_GLOBAL);

実行時リンカーは を見つけられないためlibB.so、 にpA設定されNULLます。

この場合soname、地獄からあなたを救うでしょう...

于 2016-08-15T07:27:50.117 に答える