GCC for Linux を使用して作成された共有オブジェクト ファイルをバージョン管理する方法
いくつかの例で説明してください
LD_LIBRARY_PATH には複数のバージョンの共有ライブラリが存在する可能性があります。
例えば:
/usr/lib/libform.so -> libform.so.5
/usr/lib/libform.so.5 -> libform.so.5.9
/usr/lib/libform.so.5.9
/usr/lib/libform.so.6 -> libform.so.6.0
/usr/lib/libform.so.6.0
上記の例にシンボリック リンクが存在するのは、単に-lform
.
バイナリが一連の共有ライブラリに対してリンクされると、ライブラリの特定のバージョンが要求されます。バイナリが依存するライブラリのリストは、ldd
$ ldd /usr/bin/python
linux-vdso.so.1 (0x00007ffffa5fe000)
libpython2.7.so.1.0 => /usr/lib64/libpython2.7.so.1.0 (0x00007ff6e9b6c000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007ff6e9950000)
libc.so.6 => /lib64/libc.so.6 (0x00007ff6e95ab000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007ff6e93a7000)
libutil.so.1 => /lib64/libutil.so.1 (0x00007ff6e91a4000)
libm.so.6 => /lib64/libm.so.6 (0x00007ff6e8ead000)
/lib64/ld-linux-x86-64.so.2 (0x00007ff6e9f0a000)
上記の例では、 はだけではなく にpython
依存しています。libm.so.6
libm.so
ライブラリ ファイル名のバージョン管理は通常、次の形式です。
libSOMETHING.so.VERSION
libSOMETHING.so.MAJOR_VERSION.MINOR_VERSION
一部のライブラリには、サブマイナー番号またはパッチ番号がある場合もあります。
各ライブラリには、ライブラリ内で呼び出される文字列が埋め込まれsoname
ており、コンパイル時と実行時の両方のリンカーがバージョンの互換性をチェックします。
たとえば、コンパイルされたバイナリは、メジャー バージョン番号が変更されたために動作しますが、libform.so.5
動作しlibform.so.5.9
ませlibform.so.5.9.1
ん。libform.so.6
ライブラリに情報を組み込むには、次のsoname
操作を行う必要があります。
gcc -fPIC -shared -Wl,-soname,libfoo.so.1 -o libfoo.so.1.0.0 foo.c bar.c baz.c
のマニュアルページからld
:
-soname=name
When creating an ELF shared object, set the internal DT_SONAME
field to the specified name. When an executable is linked with
a shared object which has a DT_SONAME field, then when the
executable is run the dynamic linker will attempt to load the
shared object specified by the DT_SONAME field rather than the
using the file name given to the linker.