Хотите скомпилировать собственный двоичный файл Android, который я могу запустить в терминале на телефон

Несколько дней я пытался скомпилировать собственный двоичный файл ARM Android, который будет выполняться на моем телефоне с помощью терминального приложения.Я хочу создать двоичный файл того же типа, что и стандартные двоичные файлы Posix, установленные на телефоне, такие как ls, mkdir и т. д. Я загрузил Android NDK под Mac OS X и смог скомпилировать простые двоичные файлы ELF без ошибок. Однако, когда я переношу их на телефон, они всегда segfault. То есть они segfault при компиляции с параметром -static в GCC. Если я не использую -static, они жалуются на отсутствие ссылок и т. д. Проще говоря, они не работают.

Моя гипотеза заключается в том, что они неправильно связываются со стандартной библиотекой C Android. Несмотря на то, что я связываю свои двоичные файлы с libc, предоставленным NDK, они все равно не работают. Я читал, что Android использует библиотеку Bionic C, и попытался загрузить исходный код для нее, но я не уверен, как собрать из нее библиотеку (кажется, это все сборка ARM).

Правда ли, что библиотека Android C на телефоне отличается от той, что поставляется с Android NDK? Не позволит ли тот, который включен в NDK, компилировать собственные двоичные файлы, которые я могу запустить через терминал? Любое руководство здесь очень ценится!

Обновление:

Наконец-то мне удалось заставить это работать, используя GCC 4.7.0 в Mac OS X. Я скачал заголовки Bionic, а затем скомпилировал динамически компонуемый двоичный файл с помощью библиотеки C, поставляемой с Android NDK. Я смог заставить тестовое приложение работать на телефоне, используя телефонную библиотеку C (двоичный файл был 33 КБ). Я также пытался статически связать библиотеку C NDK, и это тоже сработало.

Чтобы все это заработало, мне пришлось передать -nostdlib в GCC, а затем вручную добавить crtbegin_dynamic.o и crtend_android.o в командную строку GCC.Это работает примерно так:

$CC \
$NDK_PATH/usr/lib/crtbegin_dynamic.o \
hello.c -o hello \
$CFLAGS \
$NDK_PATH/usr/lib/crtend_android.o

Для статических двоичных файлов используйте «crtbegin_static.o». Это объясняется в источнике crtbegin_dynamic.S/crtbegin_static.S.

Для этого эксперимента я использовал только старый добрый GCC 4.7.0 и Binutils 2.22. Я также скомпилировал GCC с newlib, но на самом деле я вообще не связываю свои двоичные файлы ARM с newlib. Я заставляю GCC/ld связываться напрямую с libc, поставляемым с Android NDK, или, в случае динамических двоичных файлов, с libc на телефоне.

32
задан Synthetix 31 May 2012 в 11:51
поделиться