Я пытаюсь на пару дней скомпилировать собственный двоичный файл ARM Android, который будет выполняться на моем телефоне с помощью терминала. Я хочу создать двоичный код того же типа, что и стандартные двоичные файлы Posix, установленные на телефоне, такие как ls, mkdir и т.д. Я загрузил Android NDK под Mac OS X и смог скомпилировать простые файлы ELF без ошибок. Однако, когда я переношу их на телефон, они всегда срываются. То есть они segfault при компиляции с -статическим в GCC. Если я не использую -статический, они жалуются на то, что не связаны, и т.д. Просто, они не работают.
Моя гипотеза заключается в том, что они не связаны с стандартной библиотекой C Android. Несмотря на то, что я связываю свои двоичные файлы с libc, предоставленные NDK, они все равно не работают. Я читал, что Android использует библиотеку Bionic C и пытается загрузить исходный код, но я не уверен, как построить из него библиотеку (кажется, это сборка ARM).
Правда ли, что библиотека Android C на телефоне отличается от библиотеки Android NDK? Будет ли тот, который включен в NDK, не позволяет мне скомпилировать собственные двоичные файлы, которые я могу выполнить через терминал? Любое руководство здесь очень ценится!
Update:
Я, наконец, получил это, чтобы работать с GCC 4.7.0 в Mac OS X. Я загрузил заголовки Bionic, а затем скомпилировал динамически связанный бинарный файл, используя библиотеку C, которая поставляется с Android NDK. Я смог получить тестовое приложение для работы по телефону с помощью телефона C lib (двоичный файл был 33K). Я также попытался статически связать с библиотекой NDK C, и это также сработало.
Чтобы получить все это, мне пришлось передать -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.
В этом эксперименте я использовал только простые 'ol GCC 4.7.0 и Binutils 2.22. Я также скомпилировал GCC с newlib, но я вообще не связываю свои ARM файлы с newlib. Я заставляю GCC/ld напрямую ссылаться на libc, поставляемый с Android NDK, или в случае динамических двоичных файлов, на libc на телефоне.