Метод System.load () не загружает разделяемые библиотеки без установки переменной среды LD_LIBRARY_PATH - PullRequest
1 голос
/ 09 июня 2011

Я сталкиваюсь со странной проблемой при загрузке общих библиотек в Linux.В моем приложении есть две общие библиотеки (предположим, abc.so и xyz.so).abc.so зависит от xyz.so, т.е. всякий раз, когда вы пытаетесь загрузить abc.so, jvm сначала загружает xyz.so.

Теперь, когда я загружаю эти библиотеки, устанавливая LD_LIBRARY_PATH в папку, содержащую эти две библиотеки, она работает без проблем.Однако, когда я пытаюсь загрузить abc.so с помощью System.load ("% FULL_PATH% / abc.so"), он не загружается.Следующая строка отображается как ошибка: неопределенный символ: __cxa_pure_virtual.

Может ли кто-нибудь помочь мне понять эту ошибку?Заранее спасибо!

Примечание: из-за некоторых требований проекта я не могу изменить LD_LIBRARY_PATH и, следовательно, мне нужно загрузить abc.so с помощью метода System.load ().

1 Ответ

0 голосов
/ 09 июня 2011

Загрузка не выполняется, поскольку компоновщик не может разрешить зависимость «xyz.so» от «abc.so».Загрузчик Linux не ищет автоматически «xyz.so» в том же каталоге, что и «abc.so».Вам нужно явно указать ему, где искать, либо через переменную окружения LD_LIBRARY_PATH, либо изменив файл /etc/ld.so.conf.

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

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

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