Qu’est ce qu’un cross compiler?
Un cross compiler est une chaîne de compilation qui tourne sur une architecture mais qui génère un exécutable binaire pour une autre plate forme.
Avec notre raspberry pi, s’il est assez simple de compiler un code de petite taille,il devient très difficile de compiler de gros programmes.
Enfin, il est beaucoup plus agréable de compiler sur votre machine de guerre vos fichiers en une fraction de seconde que d’attendre une minute entre chaque retouche du code compilé par le petit processeur du raspeberry pi.
NOTE : Afin de fonctionner correctement, il est nécessaire d’utiliser une distribution utilisant le hard-float ABI. Ceci est le cas de la raspian et de la dernière version de d’arch pour le raspberry.
Le jeu d’instruction
Chaque processeur utilise son propre jeu d’instructions. Celui ci correspond au jeu d’instructions assembleur. Ce jeu d’instructions est dépendant de l’architecture du microprocesseur. Il dépend directement de la manière dont sont gravé les circuits en silicium.
L’article suivant en anglais explique le fonctionnement des portes logiques que l’on peut trouver dans un microcprocesseur : Article
Le jeu d’instructions supporté par les pc et qui est bien connu des reverser est le x86 qui correspond aux architectures Intel. Pour les AMD, c’est assez simple, c’est le même jeu d’instructions. Donc lorsqu’un code, par exemple du C, est compilé pour votre PC, il génère un assembleur x86 qui correspond à des instructions propres aux processeurs Intel et AMD.
Le problème c’est que le processeur présent sur le raspberry pi est un processeur ARM : 700 MHz ARM11 ARM1176JZF-S
Nous allons donc utiliser une chaîne de compilation qui générera un binaire pour le ARM1176JZF-S. Pour cela nous allons utiliser l’outil crosstool-ng.
Installation de crosstool-ng
Crosstool-ng est un outil permettant de construire des chaînes de compilation pour des plate-formes données.
Pour installer crosstool :
$ wget http://crosstool-ng.org/download/crosstool-ng/crosstool-ng-1.17.0.tar.bz2 $ tar xjf crosstool-ng-1.17.0.tar.bz2 $ cd crosstool-ng-1.17.0/ $ sudo ./configure --prefix=/opt/crosstool $ make $ sudo make install |
J’ai du installer quelques programmes supplémentaires. Le script configuré indique ce qu’il manque. Dans tous les cas, n’hésitez pas à poster dans les commentaires si vous avez besoin de plus d’informations.
Réaliser la chaîne de compilation pour le raspberry pi
Il va falloir créer un répertoire dans lequel crosstool-ng va enregistrer votre chaîne de configuration.
- Créer un répertoire pour héberger votre chaîne de compilation
- Lancer /opt/crosstool/bin/ct-ng menuconfig
- Dans Path and misc options cocher Try features marked as EXPERIMENTAL (touche Y)
- Toujours dans Path and misc options Changer Shell to use as CONFIG SHELL et choisir sh
- Revenir au menu principal et sélectionner Target options
- Target architecture : ARM
- Endianess : little endian
- Bitness : 32 bits
- Revenir au menu principal et sélectionner Operating system
- Choisir Target OS linux
- Revenir au menu principal et sélectionner Binary utilities
- Changer binutils version pour la 2.21.1a
- Revenir au menu principal et sélectionner C compiler
- Cocher Show Linaro versions (EXPERIMENTAL) (touche Y)
- Choisir linaro-4.6-2012.04 (EXPERIMENTAL)
- Quitter et sauvegarder les changements
Cross compilons
La compilation s’effectue alors de la manière suivante :
$ ~/x-tools/arm-unknown-linux-gnueabi/bin/arm-unknown-linux-gnueabi-gcc helloWorld.c -o helloWord $ ls helloWord helloWorld.c $ scp helloWorld pi@192.168.1.107:helloWorld pi@192.168.1.107's password: helloWord 100% 4985 4.9KB/s 00:00 |
On l’execute maintenant sur le raspeberry pi :
$ ssh pi@192.168.1.107 pi@192.168.1.107's password: Linux raspberrypi 3.2.27+ #250 PREEMPT Thu Oct 18 19:03:02 BST 2012 armv6l The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. Last login: Sun Jan 13 13:33:49 2013 from 192.168.1.100 pi@raspberrypi ~ $ ./helloWorld Oversimple says hello! |
Conclusion
On remarque qu’il est relativement difficile de monter une chaîne de compilation pour un processeur ARM et surtout assez long. La réalisation de la chaîne à pris presque une heure chez moi. Cependant, il devient très vite quasi indispensable de le faire si vous souhaitez développer sur le raspberry.
La conception et la compilation de gros projets devient donc plus simple. A titre d’information, les kernels que l’on récupère sur le site du projet raspberry sont compilé de cette manière.
Source :
helloWorld.c