2016-05-11 4 views
0

У меня есть библиотека, которую я хочу использовать. У меня нет исходного кода, но он содержит функцию, которую я хотел бы использовать. Это обычный общий объект x86-64 с некоторым кодом JNI и ничего особенного. Моя проблема в том, что библиотека ссылается на libm.so. То, что сейчас происходит, довольно странно, и я этого не ожидал. Когда я пытаюсь запустить его, он сообщает мне, что libm.so имеет недопустимый ELF-заголовок, что имеет смысл, потому что libm.so является всего лишь ссылочным файлом libm.so.6, который является фактическим файлом библиотеки.Linux Общая библиотека объектов Связь

Теперь мой вопрос, как исправить это? Я действительно удивлен, что операционная система не справляется с этим правильно, так как каждая программа будет ссылаться на libm.so, а не libm.so.6, так как она должна быть, по крайней мере, независимой от версии.

EDIT: Я сделал strace и libm.so, кажется, только верхушка айсберга ... Моя библиотека ссылающегося на многих распространенных стандартных библиотек Linux. И поскольку я выполняю его в JRE, он ищет только в каталоге JRE, и это совершенно неправильно. И поскольку библиотека взята из приложения Android, у исходного файла makefile, вероятно, были пути для библиотек, которые также не имеют смысла ... нужно сделать еще один анализ для решения этого вопроса.

+0

Библиотека, которая является символической ссылкой на фактический файл, работает так же, как любая другая символическая ссылка. Должна быть другая проблема, которая вызывает ошибку. Что касается ошибки, можете ли вы скопировать-вставить фактическую ошибку, в полном объеме и неотредактированной, и показать ее в теле вопроса? Возможно, также показывая командную строку, используемую для компоновки (это связано с тем, что связь не удалась или она не срабатывает при попытке запустить вашу программу?). –

ответ

0

Импорт должен быть libm.so.6. Импорт libm.so должен выполняться только при компиляции. В результате ELF должен импортировать первый.

Это называется версией ABI. Он предназначен для того, чтобы убедиться, что если вы связались с библиотекой в ​​определенной версии, вы получаете только фактический импорт, который совместим с версией, с которой вы связаны. Есть несколько сложных правил относительно того, когда это число изменяется (см. soname для более подробной информации).

К сожалению, вы не задали никаких вопросов. Это не объясняет, почему ваш импорт не удался. Если заголовок ELF ошибочен, вы, вероятно, ищете его (точнее, отправив ld.so, чтобы его искать) в неправильном месте.

Я бы запустил свой код с strace, чтобы посмотреть, какие файлы фактически открыты. Затем запустите file, чтобы увидеть, что платформы соответствуют (возможно, 64-разрядный исполняемый файл пытается открыть 32-битную библиотеку или наоборот).

+0

Я проанализировал strace немного больше, и на самом деле выглядит так, что JRE находит все библиотеки, открывает их и закрывает их снова. Он даже находит правильные файлы в правильных местах (он выглядит поздно, но он смотрит на/usr/lib, и есть все файлы x64 lib. Я возвращаюсь к шагу 1 снова. – SkryptX

Смежные вопросы