Crosskompilierung von statischem C hello world für Android mit arm-linux-gnueabi-gcc
Lesezeit: 4 Minuten
Ich möchte eine statische Hallo-Welt aus C mit arm-linux-gnueabi-gcc erstellen, anstatt die NDK-Standalone-Toolchain oder Codesourcery für diese Angelegenheit zu verwenden.
Ich habe es auf einem Emulator wie folgt ausgeführt:
adb push hi /data/hi
adb shell /data/hi
Aber ich bekomme das:
[1] Illegal instruction /data/hi
Welchen Schritt habe ich vergessen? Basierend auf früheren Erfahrungen hätte dies funktionieren sollen, aber ich habe das offensichtlich vermasselt.
Btw .. Tun dies auf Ubuntu Oneiric Ocelot. Außerdem ist arm-linux-gnueabi-gcc ein Link zur Version 4.6 von gnueabi-gcc.
– Korbin
21. Februar 2012 um 6:37 Uhr
Was ist deine Ubuntu-Version? Was ist die SDK-Version oder andere Emulatordetails?
– Ciro Santilli OurBigBook.com
15. August 2016 um 16:24 Uhr
Versuchen Sie, die Architektur/CPU anzugeben. Es hört sich so an, als würde der Compiler Code mit einer höheren Architekturversion erstellen, als der Emulator verarbeiten kann.
Das könnte funktionieren:
arm-linux-gnueabi-gcc -static -march=armv5 hi.c -o hi
Danke für die Antwort. Sofortiges Ergebnis (wird weiter graben), eine Warnung erhalten: Ziel-CPU unterstützt keine THUMB-Anweisungen [enabled by default]. Aber es erzeugt immer noch ein Ergebnis. Wenn ich das dann auf das Gerät drücke, bekomme ich die gleiche Illegale Anweisung.
– Korbin
21. Februar 2012 um 4:31 Uhr
Wenn ich -march=armv5te verwendet habe, bekomme ich keine Warnung, aber immer noch den illegalen Befehlsfehler. Ähnlich, wenn ich -march=armv5te -mthumb verwende.
– Korbin
21. Februar 2012 um 4:37 Uhr
Es kann sein, dass die Standardbibliotheken für arm-linux-gnueabi-gcc eine höhere Architektur verwenden als der Emulator (das klingt aber seltsam). Wir haben den gleichen Fehler beim Kompilieren mit CodeSourcery für ein Gerät mit einer ARMv4-CPU erhalten. Anscheinend waren die CodeSourcery-Bibliotheken alle ARMv5.
– Löwe
21. Februar 2012 um 11:15 Uhr
Unsere “Lösung” bestand darin, nicht mit CodeSourcery zu kompilieren und stattdessen auf dem Gerät zu kompilieren (auf dem irgendein Linux ausgeführt wurde und auf dem gcc installiert war). Wahrscheinlich nicht sehr hilfreich für Sie, da wir das Problem nicht wirklich gelöst haben und nicht wirklich sicher sind, wie wir bestätigen können, ob dies das Problem ist oder nicht.
– Löwe
22. Februar 2012 um 13:06 Uhr
Sie haben Recht, die libc, die mit den Linaro-Toolchains geliefert werden, sind für eine v7 gebaut. Es wird also Ihren Code mit der von Ihnen angeforderten Architektur kompilieren, aber dann wird beim Verknüpfen die höchste Architektur verwendet, die von einer der Bibliotheken oder Ihrem Code verwendet wird.
Dadurch wird Hello World auf dem Terminal gedruckt. Dasselbe kann auch vom Telefon aus erfolgen. Verwenden Sie zur Ausführung den Terminalemulator oder die SL4A-Bash-Shell.
Dies sollte die akzeptierte Antwort sein, obwohl Sie bitte den Befehl und seine Parameter erläutern.
– George Daramouskas
14. September 2015 um 19:51 Uhr
Korb
Wenn ich dies auf einem Debian-Computer (VM in meinem Fall) mache, scheint alles in Ordnung zu sein. Ich bin mir nicht sicher, was falsch ist, wenn ich auf Ubuntu ähnlich vorgehe. Es könnte sein, wie Leo vorgeschlagen hat, aber ich kann es nicht bestätigen. Dies sollte jedoch für Sie funktionieren.
Jemand hat diesen Link hinzugefügt, aber er verwendet nicht die Toolchain, die ich in der Beschreibung erwähnt habe. Lass es stehen, falls es jemanden interessiert.
Soweit ich weiß, können Sie keine User-Land-Anwendungen in Android ausführen, die nicht mit irgendeiner Form von gcc-arm-linux-androideabi kompiliert wurden.
Dein Code funktioniert tatsächlich für mich.
Ich habe es auf Ubuntu kompiliert und nach /data/local/tmp gepusht
Und dann chmod 777 hallo
Endlich funktioniert es gut.
Ich fand heraus (nicht sicher, ob das immer noch stimmt), dass der Cross-Compiler, den Ubuntu standardmäßig griff, nur Hard Float unterstützte und mein Gerät ein älteres war, das damit nicht funktionierte.
– Korbin
11. Dezember 2013 um 6:46 Uhr
Stahl
Hast du die Berechtigungen des Datenordners überprüft? Versuchen Sie stattdessen, das Lokale zu verwenden! Sie können einfach adb Shell und dann cd in den Ordner verwenden, in den die ausführbare Datei verschoben wurde, und ./hi versuchen. Ich denke, das ist nur ein Berechtigungsproblem
Ich fand heraus (nicht sicher, ob das immer noch stimmt), dass der Cross-Compiler, den Ubuntu standardmäßig griff, nur Hard Float unterstützte und mein Gerät ein älteres war, das damit nicht funktionierte.
– Korbin
11. Dezember 2013 um 6:46 Uhr
13946500cookie-checkCrosskompilierung von statischem C hello world für Android mit arm-linux-gnueabi-gccyes
Btw .. Tun dies auf Ubuntu Oneiric Ocelot. Außerdem ist arm-linux-gnueabi-gcc ein Link zur Version 4.6 von gnueabi-gcc.
– Korbin
21. Februar 2012 um 6:37 Uhr
Was ist deine Ubuntu-Version? Was ist die SDK-Version oder andere Emulatordetails?
– Ciro Santilli OurBigBook.com
15. August 2016 um 16:24 Uhr