Page suivante - Page précédente - Table des matières

9. Comment configurer un compilateur croisé ?

9.1 Binaires existant

La chose la plus simple pour configurer un compilateur croisé est de télécharger les binaires. Pour les machines Linux/i386 et les cibles "big endian", les paquetages nécessaires sont :

 binutils-mips-linux-2.8.1-1.i386.rpm
 egcs-c++-mips-linux-1.0.3a-1.i386.rpm
 egcs-g77-mips-linux-1.0.3a-1.i386.rpm
 egcs-libstdc++-mips-linux-2.8.0-1.i386.rpm
 egcs-mips-linux-1.0.3a-1.i386.rpm
 egcs-objc-mips-linux-1.0.3a-1.i386.rpm
Et voici la liste des paquetages pour les cibles "little endian" :

 binutils-mipsel-linux-2.8.1-1.i386.rpm
 egcs-c++-mipsel-linux-1.0.3a-1.i386.rpm
 egcs-g77-mipsel-linux-1.0.3a-1.i386.rpm
 egcs-libstdc++-mipsel-linux-2.8.0-1.i386.rpm
 egcs-mipsel-linux-1.0.3a-1.i386.rpm
 egcs-objc-mipsel-linux-1.0.3a-1.i386.rpm
Il n'est pas nécessaire de tous les installer ; la plupart des personnes peuvent oublier les compilateurs C++, Objective C et Fortran 77. Les binaires pour Intel ont été linké avec la GNU libc 2.1, donc vous devez l'installer aussi pour une mise à jour.

9.2 Construire votre propre compilateur croisé

Avant toute chose, téléchargez les paquetages des sources et les patches :

  • binutils-2.8.1.tar.gz
  • binutils-2.8.1-2.diff.gz
  • egcs-1.0.3a.tar.gz
  • egcs-1.0.3a-1.diff.gz
  • glibc-2.0.6.tar.gz
  • glibc-crypt-2.0.6.tar.gz
  • glibc-localedata-2.0.6.tar.gz
  • glibc-linuxthreads-2.0.6.tar.gz
Ce sont les versions actuellement recommandées. Des versions plus anciennes peuvent marcher comme elles ne peuvent pas marcher. Si vous essayez d'utiliser des versions plus anciennes, ne nous envoyez pas de rapport de bug s'il vous plaît ; nous n'y préterons pas attention. Lors de l'installation, veuillez procéder dans l'ordre binutils, egcs, puis glibc. A moins que vous ayez des versions plus anciennes déjà installées, le fait de changer l'ordre fera échouer l'installation. La description de l'installation suivante mentionne un certain nombre de patches que vous pouvez récupérer à partir des paquetages SRPM respectifs sur oss.sgi.com. Cependant, puisque ces paquetages SRPM sont censés être compilés dans la bonne architecture, il n'est pas possible de simplement les recompiler.

9.3 Espace disque nécessaire

Vous devez choisir un répertoire pour l'installation. Je ferais référence à ce répertoire par <prefix>. Pour éviter certain problème, il vaut mieux utiliser la même valeur pour <prefix> que pour le gcc natif. Par exemple, si votre gcc est installé dans /usr/bin/gcc alors choisissez /usr pour <prefix>. Vous devez utiliser la même valeur de <prefix> pour tous les paquetages que vous allez installer.

Pendant l'installation, il vous faudra environ 31 Mo d'espace disque pour binutils ; pour l'installation il vous faudra 7 Mo d'espace disque sur la partition contenant <prefix>. La compilation d'egcs nécesite 71 Mo et 14 Mo pour l'installation. GNU libc nécessite 149 Mo d'espace disque pendant la compilation et 33 Mo pour l'installation. Notez que ces quantités ne sont que des indications et peuvent varier significativement pour différentes architectures de processeurs et de systèmes d'exploitation.

9.4 Ordre des octets

Une des fonctionnalités particulières des architectures MIPS est que tous les processeurs sauf le R8000 peuvent être configuré pour tourner en mode gros ou petit boutien (big ou little endian). L'ordre des octets indique la manière dont le processeur stocke en mémoire les nombres sur plusieurs octets. Les machines gros boutiens stockent l'octet de poids le plus fort à l'adresse la plus basse alors que les machines petits boutiens les stockent à l'adresse la plus haute. Pensez à cela lors de l'écriture de nombres sur plusieurs octets de gauche à droite ou vice-versa.

Pour configurer correctement votre compilateur croisé, vous devez connaître l'ordre des octets du compilateur croisé cible. Si vous ne le savez pas déjà, consultez la section Hardware Platforms pour l'ordre des octets des machines.

9.5 Les noms de configuration

La plupart des paquetages basés sur autoconf supportent plusieurs architectures et systèmes d'exploitation différents. Pour différencier chaque configuration, les noms sont construits selon les schémas <cpu>-<entreprise>-<SE> voire même <cpu>-<entreprise>-<noyau>-<SE>. Selon ces schémas, les noms de configuration de Linux/MIPS sont mips-unknown-linux-gnu pour les gros boutiens ou mipsel-unknown-linux-gnu pour les petits boutiens. Ces noms sont un peu long et il est permis de les abréger en mips-linux ou mipsel-linux. Vous devez utiliser les mêmes noms de configuration pour tous les paquetages qui comprennent votre environnement de compilateur croisé. Ainsi, bien que les autres noms comme mips-sni-linux ou mipsel-sni-linux sont les noms de configuration légaux, utilisez linux-mips ou mipsel-linux à la place ; ce sont les noms de configuration connu par les autres paquetages comme les sources du noyau Linux, autrement il devra être modifié pour les compilations croisées.

Je ferais maintenant référence au nom de configuration cible par <target>.

9.6 Installation de GNU binutils

Ceci est la première partie et la plus simple - du moins si vous essayez de faire l'installation sur un quelconque UNIX sain. Entrez simplement dans un répertoire avec suffisamment d'espace disque et faites ce qui suit :

 gzip -cd binutils-<version>.tar.gz | tar xf -
 cd binutils-<version> patch -p1 < ../binutils-<version>-mips.patch
 ./configure --prefix=<prefix> --target=<target> make CFLAGS=-O2
 make install
Cela fonctionne très bien habituellement. Sur certaines machines qui utilise GCC 2.7.x comme compilateur, on raporte des dump core. C'est un bug connu de GCC et peut être résolu en mettant GCC à niveau à la version 2.8.1 ou en mettant à niveau egcs.

9.7 Assert.h

Des personnes possèdent un vieux fichier d'en-tête assert.h installé, probablement des restes d'une ancienne installation d'un compilateur croisé. Ce fichier a pour conséquence de faire échouer silencieuement les scripts autoconf ; il n'est jamais nécessaire et il a été uniquement installé à cause d'un bug dans des versions plus anciennes de GCC. Vérifiez si le fichier <prefix>/<target>/include/assert.h existe dans votre installation. Si c'est le cas, effacez-le : il n'aurait jamais dû être installé pour une quelconque version du compilateur croisé et causera des perturbations.

9.8 Installation des sources du noyau

L'installation des sources du noyau est simple. Placez-les simplement dans un répertoire de votre choix et configurez-les. Leur configuration est nécessaire pour que les fichiers qui sont générés par la procédure soient installés. Assurez-vous que vous ayez activé CONFIG_CROSSCOMPILE vers la fin du processus de configuration. L'unique problème que vous pourriez rencontrer est d'avoir besoin d'installer des programmes GNU nécessaires comme bash ou devoir écraser les versions de programmes fournies par le constructeur en plaçant les versions GNU plus tôt dans la variables PATH.

Maintenant, allez dans le répertoire <prefix>/<target>/include et créez deux liens symboliques nommés asm et linux pointant respectivement sur include/asm et include/linux dans vos sources du noyau qui viennent juste d'être installés et configurés. Ils sont nécessaires pour que les fichiers d'en-têtes nécessaires soient trouvés pendant l'étape suivante.

9.9 Première installation d'egcs

Maintenant la partie la moins rigolote commence : il existe un soit-disant problème d'amorçage. Dans notre cas, cela signifie que le processus d'installation d'egcs nécessite une glibc précédemment installée, mais nous ne pouvons pas compiler glibc parce que nous ne possédons pas encore de compilateur croisé. Heureusement, vous devrez uniquement passer par là lorsque vous installerez un compilateur croisé pour la première fois. Plus tard, lorsque vous aurez déjà installé la glibc les choses seront plus aisées. Mais pour l'instant faites :

 gzip -cd egcs-1.0.3a.tar.gz | tar xf -
 cd egcs-<version> patch -p1 < ../egcs-1.0.3a-mips.patch
 ./configure --prefix=<prefix> --with-newlib --target=<target> make SUBDIRS="libiberty texinfo gcc" ALL_TARGET_MODULES= \
 CONFIGURE_TARGET_MODULES= INSTALL_TARGET_MODULES= LANGUAGES="c"
Notez que nous n'avons pas délibérement compilé gcov, protoize, unprotoize et les bibliothèques. Gcov n'a pas de sens dans un environnement de compilateur croisé et protoize et unprotoize écraserait carrément vos programmes natifs - c'est un bug dans les makefiles de gcc. Enfin, nous ne pouvons compiler les bibliothèques parce que nous n'avons pas encore installé la glibc. Si tout ce passe avec succés, lancez l'installation avec :

 make SUBDIRS="libiberty texinfo gcc" INSTALL_TARGET_MODULES= \
 LANGUAGES="c" install
Si vous désirez le compilateur croisé pour compiler le noyau, vous avez finis. La compilation croisée de la libc est maintenant nécessaire pour pouvoir compiler les applications utilisateurs.

9.10 Tester ce que vous avez fait jusqu'ici

Simplement pour s'assurer que ce que vous avez fait jusqu'ici fonctionne, vous devriez maintenant essayer de compiler le noyau. Entrez dans les sources du noyau MIPS et tapez "make clean; make dep; make". Si tout se déroule bien, faites un "make clean" une fois de plus pour nettoyer les sources.

9.11 L'installation de la GNU libc

Faites :

 gzip -cd glibc-2.0.6.tar.gz | tar xf -
 cd glibc-2.0.6
 gzip -cd glibc-crypt-2.0.6.tar.gz | tar xf -
 gzip -cd glibc-localedata-2.0.6.tar.gz | tar xf -
 gzip -cd glibc-linuxthreads-2.0.6.tar.gz | tar xf -
 patch -p1 < ../glibc-2.0.6-mips.patch
 mkdir build
 cd build
 CC=<target>-gcc BUILD_CC=gcc AR=<target>-ar RANLIB=<target>-ranlib \
 ../configure --prefix=/usr --host=<target> \
 --enable-add-ons=crypt,linuxthreads,localedata --enable-profile
 make
Vous avez maintenant une GNU libc compilée qui doit encore être installée. Ne faites pas un simple make install. Cela écraserait vos fichiers système de votre machine par les fichiers spécifiques de Linux/MIPS avec des effets désastreux. A la place, installez la GNU libc dans un autre répertoire choisie arbitrairement <somedir> à partir du quel nous déplacerons dans le répertoire cible actuel les parties que nous avons besoin pour la compilation croisée :

 make install_root=<somedir> install
Maintenant pénétrez dans <somedir> et installez finalement la GNU libc manuellement

 cd usr/include
 find . -print | cpio -pumd <prefix>/<target>/include
 cd ../../lib
 find . -print | cpio -pumd <prefix>/<target>/lib
 cd ../usr/lib
 find . -print | cpio -pumd <prefix>/<target>/lib
La GNU libc contient aussi une vaste documentation en ligne. Votre système doit déjà posséder une version de cette documentation, donc si vous ne désirez pas installer les pages infos ce qui vous sauvera un peu moins d'un mega octets, ou si vous les avez déjà installés, sautez la prochaine étape :

 cd ../info
 gzip -9 *.info*
 find . -name \*.info\* -print | cpio -pumd <prefix>/info
Si vous n'avez pas de programme d'amorce, votre installation n'est pas finis

9.12 Recompilation d'egcs

La première tentative de compilation d'egcs a été stoppée par l'absence de la GNU libc. Puisque nous avons maintenant la libc d'installée, nous pouvons reconstruire egcs mais cette fois de façon aussi complète que l'installation d'un compilateur croisé puisse l'être :

 gzip -cd egcs-<version>.tar.gz | tar xf -
 cd egcs-<version> patch -p1 < ../egcs-1.0.3a-mips.patch
 ./configure --prefix=<prefix> --target=<target> make LANGUAGES="c c++ objective-c f77"
Comme vous pouvez le constater, la procèdure est identique que la première fois sauf que nous avons laissé tombé l'option --with-newlib. Cette option était nécessaire pour enlever l'arrêt de la compilation de libgcc à cause de l'absence de la libc. Maintenant lancez l'installation avec :

 make LANGUAGES="c c++ objective-c f77" install
Vous avez presque terminé. Si vous pensez ne pas avoir besoin des compilateurs Objective C ou F77, vous pouvez les enlever des commandes ci-dessus ; chacune vous sauvera environ 3 Mo. Ne compilez pas gcov, protoize ou unprotoize.

9.13 Dois-je compiler les compilateurs C++, Objective C ou F77 ? La réponse à cette question dépend largement de l'utilisation que vous ferez de votre environnement de compilateur croisé. Si vous avez pour unique but de recompiler le noyau Linux alors vous n'avez pas besoin d'une configuration pleine à craquer et vous pouvez ommettre en toute sécurité les compilateurs Objective C et F77. Vous devez, cependant, compiler le compilateur C++, parce que la compilation des bibliothèques inclues avec la distribution d'egcs nécessite C++.

9.14 Problème connu lors de compilation croisée

Plantage d'IRIX

Origin 200 tournant sous IRIX 6.5.1 peut se planter lors d'un "make depend" dans les sources de noyau Linux. IRIX 6.5 sur un Indy et IRIX 6.5.4 sur un Origin 200 sont connus pour fonctionner correctement. Tout rapports pour aider à isoler le problème de configuration est la bienvenue.

Ressources limitées sur les machines basées sur le standard System V

Les Unix basés sur le standard System V comme IRIX ou Solaris ont des valeurs limites maximum sur les nombres d'argument pouvant être passés à un processus enfant qui peuvent être dépassés lors de la compilation croisée de logiciels comme le noyau Linux ou la GNU libc. Pour les systèmes IRIX, la taille maximum de la liste d'arguments vaut par défaut 20 Ko alors la valeur par défaut pour Linux est d'au moins 128 Ko. Cette taille peut être modifié par la commande "systune ncargs 131072" sous root.

9.15 GDB

La compilation de GDB comme debugeur croisé a uniquement d'intérêt pour les développeurs du noyau ; leur GDB peut leur sauver la vie. Une telle configuration de debugage distant est composée de deux parties : le debugeur GDB distant fonctionnant sur une machine et la machine cible faisant tourner le noyau Linux/MIPS qui doit être débugué. Les machines sont habituellement inter-connectées par une ligne série. Le noyau de la machine cible doit être équipé d'un "embryon de débugage" qui communique avec le GDB de la machine hôte en utilisant le protocole série distant.

Suivant l'architecture cible, il vous faudra implémenter l'embryon de débugage vous-même. En général, vous devrez uniquement écrire des routines séries très simple. La tâche est, de plus, simplifiée par le fait que la plupart des machines utilisent des périphériques séries semblables, en général basé sur le 8250, le 16450 ou des dérivés.


Page suivante - Page précédente - Table des matières