web-dev-qa-db-fra.com

Compilation croisée de C Hello World statique pour Android utilisant arm-linux-gnueabi-gcc

Je veux construire un monde bonjour statique à partir de C en utilisant arm-linux-gnueabi-gcc plutôt que d'utiliser la chaîne d'outils autonome NDK ou Codeourcery d'ailleurs.

Dans Ubuntu ...

J'ai fait ce qui suit:

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

J'ai créé un hi.c comme ceci:

#include <stdio.h>

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

Je l'ai compilé comme ceci:

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

Je l'ai exécuté sur un émulateur comme celui-ci:

adb Push hi /data/hi
adb Shell /data/hi

Mais je comprends ceci:

[1]   Illegal instruction     /data/hi

Quelle étape ai-je oublié? Sur la base de l'expérience passée, ce "aurait dû" fonctionner, mais j'ai évidemment foiré ça.

35
corbin

Si je fais cela sur une machine Debian (VM dans mon cas), tout semble bien. Je ne sais pas quoi faire quand on a tort de faire pareil sur Ubuntu. Cela pourrait être comme Leo l'a suggéré, mais je ne peux pas le confirmer. Cela devrait cependant vous convenir.

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

Quelqu'un a ajouté ce lien, mais il n'utilise pas la chaîne d'outils que j'ai mentionnée dans la description. Le laisser au cas où quelqu'un serait intéressé.

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

3
corbin

Essayez de spécifier l'architecture/CPU. Il semble que le compilateur crée du code avec une version d'architecture supérieure à celle que l'émulateur peut gérer.

Cela pourrait fonctionner:

arm-linux-gnueabi-gcc -static -march=armv5 hi.c -o hi
14
Leo

Cela a fonctionné pour moi avec le compilateur CodeBench sur le bureau Ubuntu. https://sourcery.mentor.com/sgpp/lite/arm/portal/release2029

Créez simplement un binaire statique avec cette commande:

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

puis, adb Push hello/data

allez à, adb Shell $ ./data/hello Ceci imprimera Hello World sur le terminal. La même chose peut être faite à partir du téléphone. Utilisez l'émulateur de terminal ou le shell bash SL4A pour exécuter.

9
Srikant

Pour autant que je sache, vous ne pouvez pas exécuter d'applications utilisateur dans Land Android qui ne sont pas compilées avec une certaine forme de gcc-arm-linux-androideabi.

1
HacDan

Votre code fonctionne réellement pour moi.

Je l'ai compilé sur Ubuntu et je l'ai poussé vers/data/local/tmp

Et puis chmod 777 salut

Enfin ça marche bien.

0
Andong Zhan