もちろん、共有ライブラリの利用可能な任意のバージョンを使用する実行可能ファイルを作成することも可能です。
問題は、実行可能ファイルをバージョン固有のsoname (libsomething.so.1
およびlibsomething.so.2
) にリンクしたことです。代わりに、バージョン管理されていない soname を使用する必要がありましたlibsomething.so
。
これを実現するには、ビルド マシンで soname (ELF SONAME
) をlibsomething.so
(バージョンなしで) 使用してライブラリをコンパイルおよびインストールし、リンカーが実行可能ファイルのビルド中にこの soname を選択できるようにする必要があります。
Shared Libraries HOWTOによると、ライブラリのビルド中に必要なバージョン管理されていないsonameを渡すことができます。
gcc -shared -Wl,-soname,libsomething.so -o libsomething.so.X objectsomething.o
次に、ライブラリをインストールして を実行するとldconfig
、次のようになります。
- マシン A
/lib/libsomething.so
を指すシンボリック リンク。/lib/libsomething.so.1
- マシン B
/lib/libsomething.so
を指すシンボリック リンク。/lib/libsomething.so.2
ローダー ( run ldd
) は、それが指す場所に関係なく、バージョン管理されていないシンボリック リンクを選択します。
libsomething.so => /lib/libsomething.so (0xNNNNNNNN)
マシン A;
libsomething.so => /lib/libsomething.so (0xNNNNNNNN)
マシン B で。
Linux ダイナミック ローダー ( ld.so
) は、実行可能ファイル (ELF ) に書き込まれた soname 値に基づいてライブラリを解決しますNEEDED
。SONAME
値は、実行可能ファイルのビルド中にライブラリ ファイル (ELF) からコピーされます。実行可能ファイルに記録された soname と一致するシンボリック リンクがターゲット システムに存在する限り、このシンボリック リンクが指すライブラリがロードされます。
設定を実行してコマンドを表示し、仮定を検証してみましょう。
X86_64
テストにはFedora 18 を使用しi686
、わかりやすくするために出力を に調整しました。
libsomething.so.1
と の両方をコンパイルしlibsomething.so.2
ます。SONAME
unversioned に設定されていることを確認してくださいlibsomething.so
:
readelf -a libsomething.so.1 | grep SONAME
0xNNNNNNNN (SONAME) Library soname: [libsomething.so]
readelf -a libsomething.so.2 | grep SONAME
0xNNNNNNNN (SONAME) Library soname: [libsomething.so]
/lib/
ディレクトリの下のそれぞれのマシンにライブラリをインストールします。ldconfig -v
両方のマシンで実行し、出力を確認します。
ldconfig -v 2>&1 | grep something
libsomething.so -> libsomething.so.1 (changed)
ldconfig -v 2>&1 | grep something
libsomething.so -> libsomething.so.2 (changed)
実行可能ファイルをコンパイルし、バージョンのない同じ soname を参照していることを確認しNEEDED
ます。
readelf -a executable | grep NEEDED
0xNNNNNNNN (NEEDED) Shared library: [libsomething.so]
実行可能ファイルは、現在バージョン管理されていないものに依存してlibsomething.so
います。実行可能ファイルを両方のマシンにコピーし、両方のコピーに対して実行しldd
ます。
ldd executable
libsomething.so => /lib/libsomething.so (0xNNNNNNNN)
実行可能ファイルはバージョンなしの soname でビルドされているため、最後の出力は両方のマシンで同じです。これにより、ローダーはターゲットマシンでバージョン管理されていないシンボリックリンクを取得します。また、マシンによっては、シンボリック リンクがライブラリlibsomething.so.1
またはlibsomething.so.2
.