Вызов dlopen из разделяемой библиотеки, загруженной через JNI, делает ранее загруженные символы невидимыми - PullRequest
2 голосов
/ 27 февраля 2012

У меня есть приложение Java, которое взаимодействует с нативным кодом, используя JNI.Собственный код компилирует файл во время выполнения и пытается загрузить этот файл с помощью вызова dlopen .Этот вызов завершается неудачно, и я получаю предупреждение о том, что

Could not load library (x):(x) undefined symbol: y

Однако, когда у меня есть собственное приложение, запускающее JVM через JNI, запускаю тот же код, эта ошибка не возникает и выполняется какожидается.Я подозреваю, что Java делает что-то необычное, что делает уже загруженные библиотеки невидимыми для библиотеки, загруженной с dlopen .

Это я сделал для диагностики проблемы:

  • Подтверждено, в какой общей библиотеке находится символ, который предположительно не определен, с использованием objdump
  • Подтверждено, что библиотеказагружен с помощью gdb (через eclipse - библиотека была указана на панели модулей)
  • Напечатан LD_LIBRARY_PATH непосредственно перед тем, как dlopen и подтвердил, что Java пропустил его.там)

Я уже некоторое время пытаюсь решить эту проблему, но не могу понять, что происходит.Тем более, что он работает, когда JVM загружается из собственного приложения.

Заранее спасибо!

1 Ответ

6 голосов
/ 29 марта 2012

Я наконец нашел ответ. Решением было перекомпилировать разделяемую библиотеку, которая содержала символ, который не был найден с флагом компоновщика -Wl,--export-dynamic.

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

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

...