Что делать, если две общие библиотеки зависят от одной и той же версии сторонней компиляции по-разному? - PullRequest
4 голосов
/ 06 апреля 2011

Мое приложение зависит от определенной версии xerces (скомпилированной с определенными флагами):

$ ldd actimize_intelligence_server | grep xerces
    libxerces-c.so.28 => ./libxerces-c.so.28 (0x00002b3c1518f000)

Общая библиотека (полученная от клиента) также зависит от xerces (очевидно, скомпилированных с разными флагами):

$ ldd libgqt.so | grep xerces
    libxerces-c.so.28 => ./bin/libxerces-c.so.28 (0x00002b1f3d28f000)

При попытке запустить приложение выдает эту ошибку:

symbol lookup error: libgqt.so: undefined symbol: _ZN11xercesc_2_825DOMImplementationRegistry20getDOMImplementationEPKt

Отсутствует следующий символ:

xercesc_2_8 :: DOMImplementationRegistry :: getDOMImplementation (unsignedshort const *)

В то время как экспортированный символ из моего libxerces-c.so.28 выглядит так:

xercesc_2_8 :: DOMImplementationRegistry :: getDOMImplementation (wchar_t const *)

Так что я думаю, в этом проблема.Запуск strace при запуске приложения показал, что загружается мой libxerces-c.so.28:

open("/home/test/app/libxerces-c.so.28", O_RDONLY) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\0\365\31\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0555, st_size=5757256, ...}) = 0
mmap(NULL, 6791128, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x2ba744950000
mprotect(0x2ba744e82000, 1044480, PROT_NONE) = 0
mmap(0x2ba744f81000, 299008, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x531000) = 0x2ba744f81000
close(3)

Без дальнейших событий libxerces-c.so.28.

И на этом мое небольшое знание Linux заканчивается.

Могу ли я каким-то образом заставить другой libxerces-c.so.28 загрузиться, даже если он уже загружен?
Если нет, у меня есть какие-либо другие варианты, кроме сообщения клиенту, что ему нужно перекомпилировать свой код, чтобы он работалс нашими ксерсами?

Ответы [ 2 ]

3 голосов
/ 06 апреля 2011

Вы не можете сделать это вообще.Не связывайтесь с бинарной совместимостью, как это: если вы хотите динамически связываться с одной и той же библиотекой, она должна быть скомпилирована одинаково.

1 голос
/ 07 апреля 2011

Вы не сказали, для чего вам нужно libgqt.so, и от чего зависит ваше заявление.

Если , вы на самом деле не зависите от libgqt.so, ипросто используйте несколько символов из него, чтобы сделать что-то для этого конкретного клиента, тогда dlmopen(LM_ID_NEWLM, "libgqt.so", RTLD_NOW) может быть жизнеспособным решением.Документация здесь .

В целом DeadMG верен: лучше всего убедиться, что вы используете точно такую ​​же компиляцию xerces, иначе вы рано или поздно пострадаете.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...