Загрузка разделяемой библиотеки C ++ через процесс Java на Linux, выдающий ошибки - PullRequest
0 голосов
/ 26 февраля 2010

(среда разработки: CentOS 4.7, KDevelop 3.1.1, gcc 3.4.6)

Я создал общую библиотеку c ++ и тестовый исполняемый файл, который использует эту общую библиотеку. Все работает хорошо.

Но когда я загружаю эту библиотеку через Java, то есть Java вызывает JNI, который, в свою очередь, загружает эту разделяемую библиотеку, возникает ошибка, которая гласит: «* glibc обнаружено * free (): недопустимый следующий размер». Приложение выходит после этого. Эта ошибка возникает на этапе загрузки общей библиотеки.

Кто-нибудь может подсказать, что может быть причиной этого?

Я использую Java версии 1.6.0_17 (сборка 1.6.0_17-b04). Может ли быть проблема совместимости между этой версией и библиотеками времени выполнения C / C ++?

[Выполнение rpm -q показывает версию glibc на моем компьютере как glibc-2.3.4-2.41 и версию libstdc ++ как libstdc ++ - 3.4.6-10

ldd of shared library shows the following,
libpthread.so.0 => /lib/tls/libpthread.so.0 (0x00173000)
libssl.so.4 => /lib/libssl.so.4 (0x00286000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00185000)
libm.so.6 => /lib/tls/libm.so.6 (0x00111000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00134000)
libc.so.6 => /lib/tls/libc.so.6 (0x002ba000)
/lib/ld-linux.so.2 (0x008a4000)
libgssapi_krb5.so.2 => /usr/lib/libgssapi_krb5.so.2 (0x00785000)
libkrb5.so.3 => /usr/lib/libkrb5.so.3 (0x003e9000)
libcom_err.so.2 => /lib/libcom_err.so.2 (0x0013e000)
libk5crypto.so.3 => /usr/lib/libk5crypto.so.3 (0x006ae000)
libresolv.so.2 => /lib/libresolv.so.2 (0x00672000)
libcrypto.so.4 => /lib/libcrypto.so.4 (0x0044e000)
libdl.so.2 => /lib/libdl.so.2 (0x00540000)
libz.so.1 => /usr/lib/libz.so.1 (0x00141000)

]

Ответы [ 2 ]

1 голос
/ 28 февраля 2010

Вы уверены, что ни один из ваших кодов не работает, когда происходит ошибка? У вас есть функция JNI OnLoad? Некоторые статические конструкторы?

Как правило, общая структура, которую вы описываете, «просто работает», поэтому я посмотрю на ваш код.

Если вы запускаете Java в отладчике и ставите точку останова (в Java) непосредственно перед System.loadLibrary, вы можете затем использовать gdb для присоединения к процессу и установки точки останова на свободное. Затем продолжите отладчик Java и посмотрите, что вы видите в GDB.

0 голосов
/ 26 февраля 2010

См. Главу http://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html и следующую в документации gcc о том, что gcc делает с ABI.

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