Möchten Sie native Android-Binärdateien kompilieren, die ich im Terminal des Telefons ausführen kann?

Ich habe ein paar Tage lang versucht, eine native ARM-Android-Binärdatei zu kompilieren, die mit einer Terminalanwendung auf meinem Telefon ausgeführt wird. Ich möchte die gleiche Art von Binärdateien wie die auf dem Telefon installierten Posix-Standardbinärdateien wie ls, mkdir usw. erzeugen. Ich habe das Android NDK unter Mac OS X heruntergeladen und konnte einfache ELF-Binärdateien fehlerfrei kompilieren. Wenn ich sie jedoch auf das Telefon übertrage, sind sie immer fehlerhaft. Das heißt, sie sind fehlerhaft, wenn sie mit -static in GCC kompiliert werden. Wenn ich -static nicht benutze, beschweren sie sich darüber, dass sie nicht verlinkt sind. Einfach gesagt, funktionieren sie nicht.

Meine Hypothese ist, dass sie nicht ordnungsgemäß mit der Android-Standard-C-Bibliothek verknüpft sind. Obwohl ich meine Binärdateien mit der vom NDK bereitgestellten libc verbinde, funktionieren sie immer noch nicht. Ich habe gelesen, dass Android die Bionic C-Bibliothek verwendet, und habe versucht, den Quellcode dafür herunterzuladen, aber ich bin mir nicht sicher, wie ich daraus eine Bibliothek erstellen soll (anscheinend alles ARM-Assembly).

Stimmt es, dass sich die Android C-Bibliothek auf dem Telefon von der mit dem Android NDK bereitgestellten unterscheidet? Kann ich mit dem im NDK enthaltenen Programm keine nativen Binärdateien kompilieren, die ich über ein Terminal ausführen kann? Jede Anleitung hier ist sehr dankbar!

Aktualisieren:

Mit GCC 4.7.0 unter Mac OS X funktionierte dies endlich. Ich lud die Bionic-Header herunter und kompilierte dann eine dynamisch verknüpfte Binärdatei mithilfe der C-Bibliothek, die mit dem Android NDK geliefert wurde. Ich konnte eine Test-App mit der C-Bibliothek des Telefons für die Arbeit am Telefon aktivieren (die Binärdatei war 33 KB groß). Ich habe auch versucht, eine statische Verknüpfung mit der C-Bibliothek des NDK herzustellen, und das hat auch funktioniert.

Um dies alles zum Laufen zu bringen, musste ich -nostdlib an GCC übergeben und dann manuell crtbegin_dynamic.o und crtend_android.o zur GCC-Befehlszeile hinzufügen. Es funktioniert ungefähr so:

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

Verwenden Sie für statische Binärdateien "crtbegin_static.o". Dies wird in der Quelle crtbegin_dynamic.S / crtbegin_static.S erläutert.

Für dieses Experiment habe ich nur GCC 4.7.0 und Binutils 2.22 verwendet. Ich habe auch GCC mit newlib kompiliert, aber ich verbinde meine ARM-Binärdateien überhaupt nicht mit newlib. Ich zwinge GCC / ld, direkt auf die mit dem Android NDK gelieferte libc zuzugreifen, oder bei dynamischen Binärdateien auf die libc auf dem Telefon.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage