Метод System.load() не загружает общие библиотеки без установки переменной среды LD_LIBRARY_PATH

Я столкнулся со странной проблемой при загрузке общих библиотек в 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().


person Vineet    schedule 09.06.2011    source источник


Ответы (1)


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

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

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

person Rakis    schedule 09.06.2011