Мое приложение зависит от определенной версии 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
загрузиться, даже если он уже загружен?
Если нет, у меня есть какие-либо другие варианты, кроме сообщения клиенту, что ему нужно перекомпилировать свой код, чтобы он работалс нашими ксерсами?