Chcesz skompilować natywną wersję binarną Androida, którą mogę uruchomić w terminalu w telefonie

Od kilku dni próbuję skompilować natywny plik binarny ARM Android, który będzie uruchamiany na moim telefonie za pomocą aplikacji terminalowej. Chcę wygenerować ten sam typ pliku binarnego, co standardowe pliki binarne Posix zainstalowane w telefonie, takie jak ls, mkdir itp. Pobrałem Android NDK w systemie Mac OS X i udało mi się skompilować proste pliki binarne ELF bez błędów. Jednak gdy przeniesiemy je do telefonu, zawsze ulegają segregacji. Oznacza to, że ulegają segregacji po skompilowaniu z -static w GCC. Jeśli nie używam -static, skarżą się na brak połączenia itp. Mówiąc wprost, nie działają.

Moją hipotezą jest, że nie łączą się poprawnie ze standardową biblioteką C systemu Android. Mimo że łączę moje pliki binarne z libc dostarczonym przez NDK, nadal nie działają. Czytałem, że Android korzysta z biblioteki Bionic C i próbował pobrać dla niej źródło, ale nie jestem pewien, jak zbudować z niego bibliotekę (wygląda na to, że jest to cały zestaw ARM).

Czy to prawda, że ​​biblioteka Android C w telefonie różni się od tej dostarczanej z Androidem NDK? Czy ten dołączony do NDK nie pozwoli mi skompilować rodzimych plików binarnych, które mogę wykonać za pośrednictwem terminala? Wszelkie wskazówki tutaj są bardzo mile widziane!

Aktualizacja:

W końcu udało mi się uruchomić GCC 4.7.0 na Mac OS X. Pobrałem nagłówki Bionic, a następnie skompilowałem dynamicznie połączony plik binarny przy użyciu biblioteki C dołączonej do Androida NDK. Udało mi się uzyskać aplikację testową do pracy w telefonie za pomocą C lib telefonu (plik binarny wynosił 33K). Próbowałem również statycznie łączyć się z biblioteką C NDK i to również działało.

Aby to wszystko działało, musiałem przekazać -nostdlib do GCC, a następnie ręcznie dodać crtbegin_dynamic.o i crtend_android.o do linii poleceń GCC. Działa to mniej więcej tak:

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

W przypadku statycznych plików binarnych użyj „crtbegin_static.o”. Zostało to wyjaśnione w źródle crtbegin_dynamic.S / crtbegin_static.S.

W tym eksperymencie użyłem tylko zwykłego GCC 4.7.0 i Binutils 2.22. Kompilowałem także GCC z newlib, ale w rzeczywistości nie łączę moich binariów ARM z newlib. Zmuszam GCC / ld do bezpośredniego połączenia z libc dostarczonym z Androidem NDK lub w przypadku dynamicznych plików binarnych do libc w telefonie.

questionAnswers(4)

yourAnswerToTheQuestion