Я пытаюсь перенести приложение 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] Я не могу опубликовать больше одной ссылки, поэтому, если вы хотите ссылки, просто спросите их.