От няколко дни се опитвам да компилирам роден двоичен файл за ARM Android, който ще се изпълни на телефона ми с помощта на терминално приложение. Искам да генерирам същия тип двоични файлове като стандартните Posix двоични файлове, инсталирани на телефона като ls, mkdir и т.н. Изтеглих Android NDK под Mac OS X и успях да компилирам прости ELF двоични файлове без грешки. Обаче като ги прехвърля на телефона винаги сегфауват. Тоест, те се връщат към 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 lib на телефона (двоичният файл беше 33K). Също така се опитах да се свържа статично с 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 на телефона.