ошибка загрузки dynlib с помощью ldopen () - нет имени символа? - PullRequest
1 голос
/ 15 февраля 2010

Я пытаюсь перенести приложение CLI на Android. Это приложение зависит от нескольких dynlibs, которые мы уже портировали, но еще не тестировали. Мы создали .apk, который предоставляет простое приложение, библиотеки и исполняемый файл. Приложение открывает .apk, извлекает библиотеки и исполняемый файл и все. Мы перенесли все эти идеи из порта Mono в Android [3]. Мы также скопировали их способ запуска такого приложения: поскольку компоновщик загружает библиотеки только из /lib (который не существует) и /system/lib (который находится в разделе только для чтения), мы должны ldopen() Динлибс от руки. Это работает, если мы скомпилируем библиотеки и приложение для Linux.

Под эмулятором Android Cupcake мы получаем эту ошибку:

bionic/linker/linker.c:1126| ERROR:  2112 cannot locate '(null)'...
bionic/linker/linker.c:1641| ERROR: failed to link /data/data/fr.inria.hop/lib/libbigloogc-3.3b.so

Все это, конечно, было скомпилировано с компиляторами, которые поставляются с исходным кодом Android [1] [3], поэтому полученные библиотеки должны быть правильными. Учитывая природу dynlibs, мы не можем использовать (пока?) Инфраструктуру NDK для компиляции dynlibs и исполняемых файлов [2], поэтому нам пришлось положиться на эту оболочку .

Что касается вышеуказанной ошибки, я обнаружил в коде vprintf(), что это способ представления строковых параметров, указатель которых на самом деле NULL. Это означает, что есть хотя бы один символ, имя которого даже не является пустой строкой, поэтому я думаю, что dynlib как-то не так.

Тогда возникает вопрос: какие инструменты можно использовать для отладки такой ситуации, если не пытаться перекомпилировать компоновщик с включенными флагами отладки (bionic/linker/linker_debug.h) или попытаться понять код компоновщика, проанализировать .so файл и выяснить это? Было бы замечательно иметь хотя бы предварительно скомпилированные версии с включенной отладкой ...


[1] Я знаю, что могу использовать компиляторы, предоставленные в NDK, но до сих пор мы хотели придерживаться всего исходного кода. Смотрите следующую сноску.

[2] большая часть исходного кода на самом деле является кодом Scheme, который передается компилятору, который переводит его в C и использует компилятор C для создания окончательного dynlib или исполняемого файла.

[3] Я не могу опубликовать больше одной ссылки, поэтому, если вы хотите ссылки, просто спросите их.

1 Ответ

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

Да, я отвечаю себе, потому что я только что узнал, что происходит.Это ошибка в компоновщике кекса .Переменная sym_name - это та, которая используется для сообщения об ошибке на 7 строк ниже, но ей никогда не присваивается имя символа, поиск которого не удался (или вообще ничего кроме этого NULL).Это было исправлено (по крайней мере) в эклере (Android 2.0).После того, как я запустил на нем свой код, я обнаружил, какой символ был, да, отсутствовал в моем dynlib, исправил его, и теперь я немного менее раздражен в отношении платформы.

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