Могут ли две разные версии одних и тех же библиотек (с одинаковым именем) существовать в приложении? - PullRequest
6 голосов
/ 27 декабря 2010

У меня есть такой сценарий:

Product-> Platform-> mylibs (version-1)

Product-> mylibs (version-2)

Т.е. продукт использует mylibs (версия-2) напрямую. Продукт также использует платформу (которая также является динамической библиотекой), а платформа использует мои библиотеки (версия-1).

Названия библиотек, используемых продуктом и платформой, одинаковы. Только версии отличаются, и обе эти версии не совместимы.

Есть ли способ, при помощи библиотек ".so" в linux, когда платформа может ссылаться на одну версию, а продукт может ссылаться на другую версию тех же библиотек с таким же именем?

1 Ответ

6 голосов
/ 27 декабря 2010

Обратите внимание, что даже изменение имен библиотек будет недостаточно по умолчанию, так как имена символов могут конфликтовать. Ваши библиотеки должны использовать soname и версированные символы, и в этом случае они могут даже называться одинаково.

$ make
gcc -shared -fpic -Wl,-soname -Wl,libmylibs.so.1 -Wl,--default-symver -o libmylibs.so.1 mylibs1.c
gcc -shared -fpic -Wl,-soname -Wl,libmylibs.so.2 -Wl,--default-symver -o libmylibs.so.2 mylibs2.c
gcc -shared -fpic -Wl,-soname -Wl,libplatform.so.1  -Wl,--default-symver -Wl,--default-imported-symver -o libplatform.so.1 platform.c libmylibs.so.1
gcc  -Wl,-rpath-link -Wl,. -Wl,--default-imported-symver  -o program program.c libplatform.so.1 libmylibs.so.2
/usr/bin/ld: warning: libmylibs.so.1, needed by libplatform.so.1, may conflict with libmylibs.so.2
$ LD_LIBRARY_PATH=$PWD ldd ./program
    linux-vdso.so.1 =>  (0x00007fff1e3ff000)
    libplatform.so.1 => /tmp/so-4539442/libplatform.so.1 (0x00007f6dc3ba0000)
    libmylibs.so.2 => /tmp/so-4539442/libmylibs.so.2 (0x00007f6dc399f000)
    libc.so.6 => /lib/libc.so.6 (0x00007f6dc364c000)
    libmylibs.so.1 => /tmp/so-4539442/libmylibs.so.1 (0x00007f6dc344b000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f6dc3da1000)
$ LD_LIBRARY_PATH=$PWD ./program
lib version 2, platform lib version 1
...