-2

GCC for Linux を使用して作成された共有オブジェクト ファイルをバージョン管理する方法

いくつかの例で説明してください

4

1 に答える 1

2

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.6libm.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.
于 2013-03-07T07:04:25.590 に答える