51 votes

Compilation croisée pour Raspberry Pi dans GCC. Par où commencer ?

TL/DR : Où puis-je trouver plus d'informations sur la construction d'une chaîne d'outils de compilation croisée GCC 4.7.0 pour la plateforme ARM (gnueabi) (destinée à fonctionner sur un appareil Raspberry Pi) ?

Je viens de recevoir un tout nouveau Raspberry Pi et je suis très impatient de commencer à programmer pour lui. J'ai réussi à installer la chaîne d'outils GCC (j'utilise l'image système Arch Linux) et à compiler quelques programmes de base, tout fonctionne bien.

J'ai également essayé de compiler les bibliothèques Boost car je les utilise souvent dans mes projets et tout semblait fonctionner correctement en suivant les instructions ( ./bootstrap.sh + ./b2 ) sauf pour le fait que la compilation était douloureusement lente. Je l'ai laissé tourner pendant quelques heures mais il a à peine dépassé les premiers fichiers sources. Après l'avoir laissé tourner pour la nuit, j'ai découvert que le processus de compilation s'était interrompu à cause d'un manque de RAM.

Je pense donc que le Rasp Pi n'est tout simplement pas assez puissant pour compiler quelque chose d'aussi important que Boost. Donc, la compilation croisée me vient à l'esprit. Cependant, même s'il y a beaucoup d'informations sur la compilation croisée ARM disponibles en ligne, je trouve cela confus. Par où commencer ?

J'ai une version récente de GCC (4.7.0) disponible sur mon Raspberry Pi, donc je voudrais idéalement faire une compilation croisée avec la même version. Où puis-je obtenir la chaîne d'outils GCC 4.7.0 pour ARM (je vais compiler sur x86 CentOS 6.2) ?

Edit :

J'ai désalloué la mémoire inutile du GPU et mis en place une partition swap de 4 Go sur une clé USB, tandis que les fichiers de compilation sont sur un partage NFS. Boost compile maintenant beaucoup plus rapidement, ce qui est gérable. J'aimerais cependant savoir comment configurer une chaîne d'outils GCC 4.7 pour la compilation croisée sur mon PC x86, car j'ai l'intention de faire beaucoup de compilation et je voudrais qu'elle soit aussi rapide que possible.

Edit 2 :

Comme GCC 4.7.0 est relativement récent, il ne semble pas y avoir de compilateur croisé pré-construit (i386->ARM). Je vais probablement devoir en construire un moi-même, ce qui semble être une tâche non triviale (j'ai essayé et échoué). Quelqu'un connaît-il un tutoriel à suivre pour construire un compilateur croisé GCC, si possible pour l'une des versions récentes ?

J'ai essayé avec ce grand shell script (qui a bien fonctionné pour construire un compilateur de la même architecture) et j'ai réussi à construire binutils et les prérequis de GCC, mais ensuite la construction de GCC a continué à échouer avec de nombreuses erreurs cryptiques. Je suis vraiment perdu ici, donc j'apprécierais grandement votre aide.

GCC sur Raspberry Pi a été configuré avec

--prefix=/usr --libdir=/usr/lib --libexecdir=/usr/lib 
--mandir=/usr/share/man --infodir=/usr/share/info 
--with-bugurl=https://bugs.archlinux.org/ 
--enable-languages=c,c++,fortran,lto,objc,obj-c++ --enable-shared 
--enable-threads=posix --with-system-zlib --enable-__cxa_atexit 
--disable-libunwind-exceptions --enable-clocale=gnu 
--disable-libstdcxx-pch --enable-libstdcxx-time 
--enable-gnu-unique-object --enable-linker-build-id --with-ppl 
--enable-cloog-backend=isl --enable-lto --enable-gold 
--enable-ld=default --enable-plugin --with-plugin-ld=ld.gold 
--with-linker-hash-style=gnu --disable-multilib --disable-libssp 
--disable-build-with-cxx --disable-build-poststage1-with-cxx 
--enable-checking=release --host=arm-unknown-linux-gnueabi 
--build=arm-unknown-linux-gnueabi 

Edit 3 :

J'ai réussi à construire un toolchain GCC 4.7 pour ARM (yay !) en utilisant ce shell script comme le suggère l'utilisateur dwelch dans les commentaires. J'ai également construit newlib y libstdc++ en utilisant cet article comme guide. La chaîne d'outils fonctionne bien, mais lorsque je lance l'exécutable sur mon Raspberry Pi, il échoue avec le message suivant Illegal instruction . Quelle pourrait en être la cause ?

0 votes

Il y a quelques toolchains x86 ici : github.com/raspberrypi/tools/tree/master/arm-bcm2708

0 votes

Je n'ai pas trouvé la version 4.7, mais les compilateurs croisés GCC 4.6 ARM sont disponibles à l'adresse suivante https://launchpad.net/gcc-arm-embedded/+téléchargement .

1 votes

Essayez le paquet zram s'il n'est pas déjà installé. Cela créera un swap de RAM compressé, ce qui aidera plus que vous ne le pensez. (Assez bizarrement.) Ajoutez aussi un périphérique USB assez rapide, soit un disque dur USD, soit une clé USB de haute qualité et mettez-y un swap.

25voto

Tibor Points 3449

J'ai trouvé ces instructions Comment construire un compilateur croisé pour votre Raspberry Pi . Il s'agit d'un excellent moyen d'utiliser un crosstool-ng qui simplifie énormément la configuration d'une compilation croisée (il a une interface agréable basée sur curses) et il supporte GCC 4.7.

Il semble que cela fonctionne très bien !

4voto

dwelch Points 27195

http://github.com/dwelch67/raspberrypi répertoire buildgcc il y a un script pour les deux 4.7 gcc/gnu et 3.0 clang/llvm. celui de gnu est dérivé du script au projet mpx à opencores, j'ai coupé gdb et libgcc, glibc, etc l'a ramené à un compilateur. si vous voulez ces autres trucs, coupez et collez arm pour mips.

4voto

Mikhail Kupchik Points 236

Voici un guide étape par étape Comment construire un compilateur croisé Raspberry Pi sous Windows . La raison pour laquelle vous obtenez Illegal Instruction L'erreur est que la dernière version de Raspbian est compatible avec hardfp et nécessite des correctifs appropriés pour gcc et eglibc afin de supporter hardfp. Sinon, le code généré utilisera une ABI différente, c'est-à-dire qu'il passera les arguments des fonctions dans des registres différents, ce qui provoquera un crash au moment de l'exécution.

De même, une mauvaise configuration de GCC pour ARMv7 (Raspebby Pi est ARMv6) peut conduire à Illegal Instruction erreur. Veillez à spécifier --with-arch=armv6 lors de la configuration de GCC.

Le guide lié ci-dessus est basé sur GCC 4.6.3 cependant. Mais je pense qu'il devrait aussi fonctionner avec GCC 4.7.

2voto

NickT Points 14155

Je n'ai pas pu trouver une gcc 4.7, seulement une 4.6. Pour information, j'ai compilé le noyau du Pi sur une assez vieille machine Ubuntu (1Ghz, 768MB RAM) en suivant les directives de cette page : Compilation du noyau

La construction a duré environ 90 minutes, alors qu'il est suggéré qu'elle prenne 6 heures sur le Pi. Le noyau fonctionne bien sur le Pi. Peut-être pouvez-vous adapter ces directives pour la compilation croisée d'autres projets sur votre machine Linux x86.

0voto

mlepage Points 582

Comme vous l'avez noté, la construction sur le Raspberry Pi lui-même est lente, mais fiable (puisqu'il n'y a pas de compilation croisée), à condition que vous ne manquiez pas de mémoire. Il est peut-être possible de modifier les paramètres de mémoire et d'échange pour permettre des constructions plus importantes (à défaut d'être rapides). Je sais que sur les forums, les gens parlent de mettre les partitions racine sur les cartes SD, les partitions utilisateur sur les clés USB, et bien sûr, cela fera probablement une différence d'obtenir une carte SD rapide (classe 6 ou mieux). Il est possible, avec le temps, que les performances de compilation s'améliorent à mesure que le logiciel s'améliore. Ou, peut-être que Raspberry Pi 2 aura un chipset amélioré et plus de RAM :-)

0 votes

Merci pour la suggestion, mais 30 minutes sur RPi contre 1 minute sur mon ordinateur portable, c'est TRÈS peu pratique pour le développement où j'ai beaucoup de reconstruction à faire. Si la différence n'était pas aussi radicale, je construirais certainement sur le dispositif.

0 votes

Oui, je suis dans le même bateau, environ 30 minutes de construction sur le RPi. Je vais développer sous Linux (Ubuntu VM sur Mac OS X, en fait), puis faire des constructions sur RPi quand je veux tester dessus. J'espère que cela sera suffisant pour mon objectif (c'est une configuration raisonnable) mais si ce n'est pas le cas, je ferai aussi de la compilation croisée.

0 votes

Je ne sais pas si mon Pi est différent, mais j'en ai un de 2012. Il est overclocké à 1000MHz. Pourtant, il est capable de compiler mon plus gros programme ~10k lignes de code réel (pas de commentaires, etc.). J'obtiens des temps de compilation d'environ 30s à 3 minutes selon que je supprime ou non tous les objets de sortie. J'obtiens rarement le segfault de GCC. Cependant, c'est vraiment un problème de déboguer et de modifier le code à la volée avec ce temps de compilation ! Je débogue tous mes programmes sur mon ordinateur portable avec Ubuntu et les compile ensuite pour le Pi ! Cela fonctionne parfaitement !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X