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.

Unter Ubuntu…

Ich habe Folgendes getan:

sudo apt-get install gcc-arm-linux-gnueabi

Ich habe ein hi.c wie folgt erstellt:

#include <stdio.h>

int main(int argc, char** argv) {
   printf("hello world\n");
   return 0;
}

Ich habe es so zusammengestellt:

arm-linux-gnueabi-gcc -static hi.c -o hi 

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.

    – Korbin

    15. Juni 2012 um 3:55 Uhr

Srikants Benutzeravatar
Srikant

Es hat bei mir mit dem CodeBench-Compiler auf dem Ubuntu-Desktop funktioniert.
https://sourcery.mentor.com/sgpp/lite/arm/portal/release2029

Erstellen Sie einfach eine statische Binärdatei mit diesem Befehl:

arm-none-linux-gnueabi-gcc -o hello -static hello.c

dann drücken Sie es zum Telefon

adb push hello /data/local/tmp

geh und führe es aus:

adb shell
$ chmod 755 /data/local/tmp/hello
$ /data/local/tmp/hello

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

corbins Benutzeravatar
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.

http://www.cnx-software.com/2012/01/16/installing-emdebian-arm-cross-toolchain-in-debian/

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.

http://tariqzubairy.wordpress.com/2012/03/09/arm-binaries-static-library-for-android/

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

Benutzeravatar von psteelk
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

1394650cookie-checkCrosskompilierung von statischem C hello world für Android mit arm-linux-gnueabi-gcc

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy