Mai 2005 Rsum Cet article dcrit la mis en place d'une chane de compilation croise utilisable dans l'environnement Linux x86 ou bien Windows 2000 et XP. Au cours de ce document nous dcrirons des tests rels sur une cible Linux ARM mais les concepts dcrits restent valable pour une autre architecture type PowerPC ou MIPS. Introduction Dans la srie d'articles consacrs aux aspects industriels et embarqus de Linux publis prcdemment, nous avons toujours utilis un environnement Linux x86. Mme si cet environnement est trs rpandu, il est loin d'tre le seul utilis dans ce type d'application. En effet, d'autres processeurs comme l'ARM ou le PowerPC sont parfois mieux adapts que l'architecture x86. Cependant, la plupart des dveloppeurs utiliseront un PC x86 (Linux ou Windows) comme poste de travail et il est donc ncessaire de mettre en place un chane de dveloppement croise permettant de dvelopper du code non-x86 sur un PC. Dans cet article, nous allons dcrire plusieurs solutions open sources disponibles utilisables sur Linux x86. Ne expliquerons galement comment mettre en oeuvre certains de ces outils sur plate-forme Windows en utilisant l'environnement d'mulation CYGWIN. A titre d'exemple, nous mettrons en place et testerons une chane de dveloppement pour cible ARM. La compilation sous Linux La chane de compilation GNU utilise les composants suivants: Le compilateur qui constitue le paquetage gcc. Les outils annexes (assembleur, diteur de liens, etc.) qui constituent le paquetage binutils. La GNU-Libc qui constitue le paquetage glibc Ce paquetage contient en gnral la bibliothque de gestion des threads (soit le plus souvent LinuxThreads). Dans le cas d'un systme Linux x86, ces paquetages sont installs sur le systme sous forme de paquetages RPMS ou DEB dans le cas de la distribution DEBIAN. Dans le cas de la distribution Red Hat, nous aurons par exemple: $ rpm -qv gcc gcc-3.2.2-5 $ rpm -qv binutils binutils-2.13.90.0.18-9 $ rpm -qv glibc glibc-2.3.2-11.9 1 Concernant le paquetage binutils, ce dernier contient des outils utiliss pour la gnration et la manipulation des excutables ou des fichiers objets (.o) intermdiaires. On notera dans ce paquetage le prsence de l'assembleur as ou de l'diteur de liens ld. $ rpm -ql binutils /usr/bin/addr2line /usr/bin/ar /usr/bin/as /usr/bin/gprof /usr/bin/ld /usr/bin/nm /usr/bin/obcop! /usr/bin/obdump /usr/bin/ranlib /usr/bin/readelf /usr/bin/si"e /usr/bin/strings /usr/bin/strip ... Dans le cas de la compilation croise, ces diffrents outils, ainsi que le compilateur, seront excuts dans un environnement x86 (Linux ou Windows) mais le code gnr sera d'un type diffrent (exemple: ARM). Il est donc ncessaire de compiler le paquetage partir des source en spcifiant de nouvelles options de gnration. Pour ce faire, le script configure inclus dans les paquetages permet de spcifier le type d'architecture sur lequel s'excute l'outil (option --#ost) ainsi que le type d'architecture cible (option --target). Dans le cas ou les options ne sont pas prcises, le script gnrera par dfaut une configuration pour un excutable natif, utiliser dans l'environnement de compilation courant. Voici un exemple pour le paquetage binutils. $ ./configure loading cac#e ./config.cac#e c#ec$ing #ost s!stem t!pe... i%8%-pc-linu&-gnu c#ec$ing target s!stem t!pe... i%8%-pc-linu&-gnu c#ec$ing build s!stem t!pe... i%8%-pc-linu&-gnu ... Par contre si l'on prcise les options cites prcdemment on obtient: $ ./configure --#ost'i%8%-pc-linu&-gnu --target'arm-linu& creating cac#e ./config.cac#e c#ec$ing #ost s!stem t!pe... i%8%-pc-linu&-gnu c#ec$ing target s!stem t!pe... arm-un$no(n-linu&-gnu c#ec$ing build s!stem t!pe... i%8%-pc-linu&-gnu ... La gnration de la chane de compilation croise est donc ralisable la main mais elle est souvent fastidieuse car elle peut ncessiter l'application de patch sur un ou plusieurs paquetage en fonction des diffrentes architectures. De ce fait, l'utilisateur non averti risque de disposer d'un chane errone et il est donc conseill d'utiliser des outils spcialiss. Dans la suite du chapitre, nous prsenterons donc l'outil ELDK (pour Embedded Linux Development Kit) dvelopp par DENX Software (voir http://www.denx.de/ELDK.html) ainsi que l'outil CROSSTOOL dvelopp par Dan Kegel (voir http://kegel.com/crosstool). Nous prcisons 2 que ces deux outils sont totalement libres et diffuss sous licence GPL. Il n'y a pas non plus de restriction concernant les projets dvelopps avec ces outils. Mise en oeuvre de l'outil ELDK ELDK est dvelopp par DENX Sofware, socit de consulting Linux situe en Allemagne. Le fondateur, Wolfgang Denk, est un professionnel de talent, contribuant de nombreux projets open source dont RTAI (voir http://www.rtai.org). Le produit est disponible sous forme de paquetages RPM binaires ou sources. Il est galement possible de tl-charger l'image ISO du CDROM contenant les binaires ou les sources. ELDK permet de mettre en place une chane de compilation utilisable sur un PC Linux x86 pour des cibles PowerPC, MIPS ou ARM. Cet outil fournit galement une distribution que l'on peut utiliser comme root-filesystem au travers d'un montage NFS. Cette technique permet de faciliter la mise au point car il n'est pas ncessaire de mettre jour systmatiquement la cible. La version de noyau fournie par ELDK est la 2.4.25 amliore par Denx principalement pour la plate-forme PowerPC. L'installation est trs simple. Il suffit de tl-charger l'image ISO du CDROM auprs d'un des miroirs du projet soit au choix: ftp://mirror.switch.ch/mirror/eldk/eldk/ http://mirror.switch.ch/ftp/mirror/eldk/eldk/ ftp://sunsite.utk.edu/pub/linux/eldk/ http://sunsite.utk.edu/ftp/pub/linux/eldk/ ftp://ftp.sunet.se/pub/Linux/distributions/eldk/ http://ftp.sunet.se/pub/Linux/distributions/eldk/ ftp://ftp.leo.org/pub/eldk/ http://archiv.leo.org/pub/comp/os/unix/linux/eldk/ La dernire version ce jour est la 3.1.1, il faut noter que les images ISO n'existent pas forcment pour les anciennes versions comme la 2.1.0. A partir de l'image ISO, il est ais de graver le CD sur un systme Linux, ou mme sur une machine Windows. On peut aussi utiliser l'image ISO grce la fonction de loopback device du noyau Linux. Cette fonctionnalit permet de monter un fichier image comme si il constituait un priphrique physique (exemple: un CDROM au format ISO-9660, une disquette au format VFAT). Elle est disponible en standard sur les noyaux fournis avec les distributions. Sur un noyau compil, il faudra valider l'option Block devices/Loopback device support lors de la configuration du noyau par ma$e &config. On peut donc monter le fichier en utilisant la commande suivante: ) mount -t iso9%%0 -o loop mon*image.iso /mnt/cdrom Lorsque l'image (ou le CD) est monte, on peut installer la distribution en excutant simplement la commande suivante. $ /mnt/cdrom/install -d /opt/eld$*arm +o !ou reall! (ant to install into /opt/eld$*arm director!,!/n-./ !
0reating directories +one 3 1nstalling cross 234s
3reparing... ))))))))))))))))))))))))))))))))))))))))))) ,1005- 1/rpm ))))))))))))))))))))))))))))))))))))))))))) ,1005- 3reparing... ))))))))))))))))))))))))))))))))))))))))))) ,1005- 1/rpm-build ))))))))))))))))))))))))))))))))))))))))))) ,1005- 3reparing... ))))))))))))))))))))))))))))))))))))))))))) ,1005- 1/binutils-arm ))))))))))))))))))))))))))))))))))))))))))) ,1005- ... Dans le cas du PowerPC, on pourra prciser les architectures installer (ppc_4xx, ppc_6xx, etc.). Par dfaut, la procdure installe toutes les architectures. $ /mnt/cdrom/install -d /opt/eld$*ppc ppc*6&& ppc*%&& Remarque: Il n'est pas ncessaire d'installer ELDK en tant que super-utilisateur (root). Dans le cas ou ELDK est install en tant que simple utilisateur il est fait bien entendu disposer des droits d'criture sur le rpertoire d'installation. Dans le cas de l'utilisation du root-filesystem ELDK par NFS, il sera ncessaire d'utiliser le script 78+9*4:97+7; pour crer les entres dans le rpertoire /dev de l'image fournie par ELDK. Si ELDK n'est pas install en tant que super-utilisateur, il faudra utiliser 78+9*<1=>?@72 pour configurer correctement l'image NFS comme dcrit dans la documentation ELDK sur http://www.denx.de/twiki/bin/view/DULG/ELDKMountingTargetComponentsViaNFS. Lorsque le paquetage est install, la chane de compilation est utilisable si l'on le chemin d'accs aux outils sa variable d'environnement PATH comme ci-dessous. $ 3:AB'/opt/eld$*arm/usr/bin/$3:AB $ e&port 3:AB A partir de la on peut utiliser le compilateur et les outils associs. $ arm-linu&-gcc -v 8ecture des spCcification D partir de /opt/eld$*arm/usr/bin/../lib/gcc-lib/arm- linu&/3.3.3/specs 0onfigurC avec/ ../configure --prefi&'/usr --mandir'/usr/s#are/man --infodir'/usr/s#are/info --enable-s#ared --enable-t#reads'posi& --disable- c#ec$ing --(it#-s!stem-"lib --enable-**c&a*ate&it --(it#-ne(lib --enable- languages'cEcFF --disable-libgc --#ost'i38%-red#at-linu& --target'arm-linu& 4odGle de t#read/ posi& version gcc 3.3.3 H+7@= 78+9 3.1.1 3.3.3-9I On peut compiler le programme de test classique Hello World. $ arm-linu&-gcc -o #ello(ord #ello(orld.c $ file #ello(orld #ello(orld/ 78< 32-bit 8JK e&ecutableE :24E version 1 H:24IE for L@M/8inu& 2.2.5E d!namicall! lin$ed Huses s#ared libsIE not stripped La dernire commande indique bien que nous sommes en prsence d'un excutable ARM. Mise en oeuvre de CROSSTOOL L'outil CROSSTOOL est quelque peu diffrent car il est plus complexe apprhender mais aussi 4 plus souple. Le complexit vient du fait qu'il n'existe pas de distribution binaire ni de programme d'installation aussi simple que pour ELDK. C'est d'ailleurs tout fait normal car le but de CROSSTOOL est de fournir l'utilisateur un ensemble de scripts lui permettant de construire sa chane de compilation mme dans les cas les plus complexes alors qu' ELDK est limit l'hte Linux x86 et aux cibles PowerPC, MIPS et ARM. Avec CROSSTOOL, on choisit donc l'environnement hte (host), la cible (target), les versions des paquetages utiliser (gcc, binutils, etc.) mais aussi les diffrents patches appliquer aux diffrents paquetages ou le noyau utilis et ses patches associs. CROSSTOOL effectue galement le tl-chargement des paquetages ncessaire la gnration de la chane dfinie par l'utilisateur. L'outil CROSTOOL est entirement crit en langage script-shell ce qui lui donne un air old- style qui n'est pas pour dplaire aux geeks chevronns dont je fais partie! Pour utiliser CROSSTOOL, il faut tout d'abord installer l'archive tl-charge depuis le site de Dan Kegel. Dans notre cas nous allons utiliser la version 0.31, dernire jour au moment de l'criture de ces lignes. Une fois la distribution installer, une documentation en anglais est disponible dans le fichier doc/crosstool-#o(to.#tml. La structure du rpertoire crosstool-0.31 est trs simple, les fichiers importants tant localiss directement sur la racine du rpertoire. Le fichier all.s# est le script principal de gnration de la chane. Les fichier de demo-&&&.s# comme demo-i%8%.s# sont des exemples fournis dont l'utilisateur peut s'inspirer pour construire sa propre configuration. Les fichiers .dat permettent de dfinir des variables d'environnement utiliss par les scripts. Par exemple, le fichier i%8%-c!g(in.dat dfinit des variables indiquant que la cible est CYGWIN. $ cat i%8%-c!g(in.dat A:2L7A'i%8%-pc-c!g(in A:2L7A*0<8:LJ'N->N Les fichiers .config correspondent des configurations du noyau Linux gnres par un ma$e &config ou un ma$e config en gnral et ce pour les diffrents processeurs supports (exemples: i%8%.config, m%8$.config). Ce principe peut tre tendu toute autre systme de configuration utilisant un format similaire. Ces fichiers sont utiliss par les fichiers .dat cits prcdemment. $ cat i%8%.dat 972@780>@<1L'Op(dO/i%8%.config A:2L7A'i%8%-un$no(n-linu&-gnu A:2L7A*0<8:LJ'N->N D'autres sous-rpertoires sont prsents et nous pouvons citer. Le rpertoire do(nload qui accueille les paquetages manquants tl-chargs par CROSSTOOL lors de la gnration de la chane. Le rpertoire patc#es qui contient lui-mme des sous-rpertoire correspondant aux diffrents paquetages utilisables. Chaque sous-rpertoire contient les patches appliquer en fonction de la configuration dfinie par l'utilisateur. Nous pouvons donner l'exemple du paquetage correspondant gcc-3.3.4. $ ls -( 1 patc#es/gcc-3.3.6/ gcc-3.3.6-arm-bigendian.patc# 5 gcc-3.3.6-libstdc&&-s#.patc# gcc-3.3.6-ppc-asm-spec.patc# La documentation propose en tant qu'introduction de gnrer un chane de compilation native i686 ce qui n'a pas beaucoup d'intrt autre que pdagogique. Pour cela il suffit d'utiliser la commande suivante: $ ./demo-i%8%.s# Le script est extrmement simple, nous avons au dbut du fichier les lignes suivantes: )P/bin/s# set -e& A:2K:88J*+12'$B>47/do(nloads 27JM8A*A>3'/opt/crosstool e&port A:2K:88J*+12 27JM8A*A>3 L00*8:@LM:L7J'NcEcFFN e&port L00*8:@LM:L7J ) 2eall!E !ou s#ould do t#e m$dir before running t#isE ) and c#o(n /opt/crosstool to !ourself so !ou donQt need to run as root. m$dir -p $27JM8A*A>3 Suite cela, la gnration de la chane est lance par la ligne suivante, qui indique que la chane en question sera base sur la configuration i686, le compilateur gcc-3.4.3 et la glibc-2.3.4. eval Ocat i%8%.dat gcc-3.6.3-glibc-2.3.6.datO s# all.s# Rnotest Ce petit exemple n'est cependant pas trs significatif et nous allons construire un script demo- at91.s# permettant de crer une chane de compilation croise Linux x86 vers une architecture ARM ATMEL AT91RM9200. Cette chane est similaire celle fournie dans ELDK. Au dbut du fichier, nous indiquons le rpertoire dans lequel CROSSTOOL stockera les paquetages tl-chargs: A:2K:88J*+12'Op(dO/do(nloads e&port A:2K:88J*+12 m$dir -p $A:2K:88J*+12 Ensuite nous pouvons dfinir le rpertoire destination de la cible. 27JM8A*A>3'/opt/crosstool e&port 27JM8A*A>3 m$dir -p $27JM8A*A>3 Comme pour l'exemple prcdent, la chane pourra traiter les langages C et C++. L00*8:@LM:L7J'NcEcFFN e&port L00*8:@LM:L7J La chane utilisera le noyau 2.4.27, la configuration du noyau tant dfinie dans le fichier config- $ernel. 972@780>@<1L'Op(dO/patc#es/linu&-2.6.2S/config-$ernel e&port 972@780>@<1L 6 Le rpertoire linu&-2.6.2S n'existe pas dans la distribution CROSSTOOL mais il suffit de l'ajouter. Le rpertoire contient les diffrents patches appliquer au noyau ainsi que le fichier de configuration du noyau. $ cd patc#es/linu&-2.6.2S $ ls -( 1 01*2.6.2S-vrs1.patc# 02*2.6.2S-vrs1-at91-0%102006.patc# 03*2.6.2S-m$depFcross-depmod.patc# 06*2.6.2S-$bdFsramFflas#.patc# config-$ernel Remarque: Pour que CROSSTOOL considre le fichier comme un patch, le nom du fichier doit obligatoirement contenir la chane de caractre patc# ou bien le suffixe .diff. De mme, il est recommand de numroter les fichiers de patch en commenant leurs noms par l'ordre d'application (01, 02, etc.). Le lecteur dsirant plus d'information pourra consulter le code source du script getandpatc#.s#. Si nous revenons notre script principal, la cible de la chane est l'architecture arm-linux. A:2L7A'arm-linu& e&port A:2L7A A:2L7A*0<8:LJ'N->N e&port A:2L7A*0<8:LJ La chane de compilation correspondante sera installe dans /opt/crosstool/arm. 327<1='$T27JM8A*A>3U/arm e&port 327<1= Enfin nous dfinissons la liste des paquetages utiliser. K1@MA18J*+12'binutils-2.15 L00*+12'gcc-3.3.6 L81K0*+12'glibc-2.3.2 L81K0AB27:+J*<187@:47'glibc-linu&t#reads-2.3.2 81@M=*+12'linu&-2.6.2S e&port K1@MA18J*+12 L00*+12 L81K0*+12 L81K0AB27:+J*<187@:47 81@M=*+12 La gnration de la chane elle-mme est effectue par la dernire ligne. eval s# all.s# --notest Aprs avoir lanc la gnration par la commande demo-at91.s#, nous devons attendre de longues heures avant de rcolter les fruits de nos efforts. Afin de suivre le droulement de l'excution, il est souhaitable de conserver les traces dans un fichier par la commande: $ ./demo-at91.s# 1Vbuild.log 2VW1 W On peut de temps en temps suivre l'volution de la compilation par la commande: $ tail -f build.log 7 Lorsque la chane est gnre avec succs nous obtenons le message suivant dans le fichier. 0ross-toolc#ain build complete. 2esult in /opt/crosstool/arm. test#ello/ 0 compiler can in fact build a trivial program. +one. A partir de la, on peut tester la chane de compilation comme nous l'avons fait pour ELDK. $ 3:AB'/opt/crosstool/arm/bin/$3:AB $ e&port 3:AB $ arm-linu&-gcc -v 2eading specs from /opt/crosstool/arm/lib/gcc-lib/arm-linu&/3.3.6/specs 0onfigured (it#/ /#ome/pierre/test/crosstool-0.31/build/arm-linu&/gcc-3.3.6- glibc-2.3.2/gcc-3.3.6/configure --target'arm-linu& --#ost'i%8%-#ost*pc-linu&-gnu Rprefi&'/opt/crosstool/arm --(it#-#eaders'/opt/crosstool/arm/arm-linu&/include --(it#-local-prefi&'/opt/crosstool/arm/arm-linu& --disable-nls --enable- t#reads'posi& --enable-s!mvers'gnu --enable-**c&a*ate&it --enable-languages'cEcF F --enable-s#ared --enable-c99 --enable-long-long A#read model/ posi& gcc version 3.3.6 On peut ds lors compiler le programme de test Hello World. $ arm-linu&-gcc -o #ello(ord #ello(orld.c $ file #ello(orld #ello(orld/ 78< 32-bit 8JK e&ecutableE :24E version 1 H:24IE for L@M/8inu& 2.6.3E d!namicall! lin$ed Huses s#ared libsIE not stripped Utilisation de l'environnement CYGWIN La quasi-totalit des outils prsents dans ce magazine sont utilisable dans un environnement Linux. Cependant, il est clair que c'est loin d'tre aujourd'hui l'environnement de dveloppement le plus utilis. La plupart des outils commerciaux sont disponibles souvent exclusivement sous Windows et la mise en place d'une chane de dveloppement sous Linux peut poser des problmes dans les grandes entreprises pour lesquelles la gestion du parc informatique est centralise. La socit CYGNUS (lie Red Hat Software) propose depuis longtemps un environnement sous Windows permettant de porter trs rapidement les applications de Linux vers Windows. Le principe est de diriger les appels systmes normalement destins au noyau Linux vers une DLL (pour Dynamic Loading Library) Windows fournie par CYGWIN sous le nom de 0XL?1@.+88. La majorit des outils disponibles sous Linux sont de ce fait disponibles sous CYGWIN, citons entre-autres: les commandes Linux commencer par l'interprteur de commande bas# la chane de compilation GNU l'environnement graphique XFree86 le bureau graphique KDE De ce fait, il est possible l'aide de CROSSTOOL de construire une chane de compilation croise 8 utilisable sous Windows et CYGWIN et permettant de gnrer du code ARM. Remarque: A matriel quivalent, il faut cependant noter que la configuration CYGWIN sera moins performante que la mme chane utilise sur un systmes Linux. De mme, il existe encore quelques problmes dans les adaptations CYGWIN des outils graphique comme KDE. La solution CYGWIN est donc utiliser en dernier recours. Installation de l'environnement CYGWIN La distribution CYGWIN est utilisable sur des environnement Windows rcents comme Windows 2000 ou Windows XP. Elle est disponible sur Internet sur le site http://www.cygwin.com. A partir de la page de garde du site, on peut tl-charger le fichier setup.e&e qui est une application Windows permettant d'installer la suite de la distribution. Remarque: Il est est prfrable d'installer CYGWIN sur une partition de type NTFS et non VFAT afin d'viter certains problmes de droits d'accs aux fichiers. On peut connatre le type de systme fichier en affichant les proprits Windows de la partition en question (utiliser le bouton droit de la souris sur le volume correspondant). Lorsque l'on double-clique sur l'icne associe au fichier setup.e&e, on obtient la fentre suivante. Figure 1: Excution de setup.exe Lors de la premire installation, il est conseill d'utiliser l'option Install from Internet. Les fichiers utiliss sont sauvs sur le disque local ce qui permettra d'effectuer ultrieurement une installation 9 partir d'un rpertoire local (Install from Local Directory) si cela tait ncessaire. Figure 2: Choix du type d'installation L'cran suivant slectionner le rpertoire d'installation (soit c/Yc!g(in par dfaut). Figure 3: Choix du rpertoire d'installation 10 On slectionne ensuite un serveur miroir de la distribution CYGWIN permettant le chargement des fichiers. Figure 4: Choix du serveur miroir Le programme d'installation rcupre alors la liste des paquetages et la prsente l'utilisateur. Dans le cas prsent nous conseillons d'installer la totalit de la distribution. 11 Figure 5: Liste des paquetages Pour ce faire, il faut cliquer sur le mot Default situ sur la premire ligne de la liste (commenant par All), ce moment la, le programme affiche Install la place de Default dans toute la liste, ce qui indique que tous les paquetages sont installs. Il faut noter que l'installation des tous les paquetages occupe plus de 2 Go sur le disque. Figure 6: Slection des paquetages 12 Si l'on clique sur Suivant, l'installation doit dmarrer. En cas de blocage de l'installation cause d'un problme d'accs rseau, il est possible d'interrompre le programme d'installation puis de l'excuter de nouveau. L'installation reprendra au niveau du dernier paquetage install. Lorsque l'installation est termine, on doit obtenir un icne Cygwin sur le bureau Windows, ce qui permet d'ouvrir le terminal CYGWIN qui a une fire allure de bon vieux terminal Linux. Figure 7: Terminal CYGWIN En premier lieu, il faut excuter la commande rebaseall -v dans le terminal. Cette commande est ncessaire car elle permet d'affecter une adresse de base unique aux diffrentes DLL et donc permettre un chargement ordonn des bibliothques. On peut alors dmarrer l'environnement XFree86 qui par dfaut affiche un mulateur de terminal &term. A partir de ce terminal, on peut lancer les commandes Linux habituelles comme le montre la figure ci-dessous. 13 Figure 8: Environnement CYGWIN Cration de la chane de compilation croise pour ARM L'environnement Linux quasiment complet tant disponible, la procdure gnration de la chane croise CROSSTOOL est identique celle utilise sous Linux, dcrite plus haut dans ce mme chapitre. Il faut noter cependant que le type de plate forme de dveloppement dtect par le script de configuration configure est dans notre cas i686-host_pc-cygwin au lieu de i686-pc-linux-gnu. Attention: Les scripts de CROSSTOOL ne s'entendent pas forcment trs bien avec les noms de rpertoire contenant des espaces, ce qui est frquent sous Windows. Il est donc prfrable d'extraire l'archive CROSSTOOL dans un rpertoire ayant un nom UNIX comme /#ome/test et non pas /#ome/mon rCpertoire. Aprs quelques heures de compilation, on obtient la mme chane de dveloppement incluant le compilateur arm-linu&-gcc. On peut y accder de la mme manire que sous Linux. $ e&port 3:AB'/opt/crosstool/arm/bin/$3:AB $ arm-linu&-gcc -v 2eading specs from /opt/crosstool/arm/lib/gcc-lib/arm-linu&/3.3.6/specs 0onfigured (it#/ /#ome/test/crosstool-0.31/build/arm-linu&/gcc-3.3.6-glibc- 2.3.2/gcc-3.3.6/configure --target'arm-linu& --#ost'i%8%-#ost*pc-c!g(in --prefi&'/opt/crosstool/arm --(it#-#eaders'/opt/crosstool/arm/arm-linu&/include --(it#-local-prefi&'/opt/crosstool/arm/arm-linu& --disable-nls --enable- t#reads'posi& --enable-s!mvers'gnu --enable-**c&a*ate&it --enable-languages'cEcF 14 F --enable-s#ared --enable-c99 --enable-long-long A#read model/ posi& gcc version 3.3.6 Et l'on peut bien sr compiler l'exemple de la mme manire. $ p(d /#ome/Zo#n +oe $ arm-linu&-gcc -o #ello(orld #ello(orld.c $ file #ello(orld #ello(orld/ 78< 32-bit 8JK e&ecutableE :24E version 1 H:24IE for L@M/8inu& 2.6.3E d!namicall! lin$ed Huses s#ared libsIE not stripped Exemples de compilation croise Lorsqu'une chane de compilation est installe, il est possible de construire des outils partir des paquetages. Voici quelques exemples. Le noyau Linux pour ARM/AT91RM9200 L'architecture ARM est supporte par le noyau Linux mais il est ncessaire d'appliquer des patch disponibles sur http://www.arm-linux.org.uk/developer. Dans le cas d'un noyau 2.4.27, on doit tout d'abord extraire l'archive du noyau standard puis appliquer le patch gnrique ARM et enfin le patch spcifique au processeur ATMEL AT91RM9200. ) cd linu&-2.6.2S ) patc# -p1 [ 2.6.2S-vrs1.patc# ) patc# -p1 [ ../linu&-patc#/02*2.6.2S-vrs1-at91-0%102006.patc# La suite est trs similaire la compilation d'un noyau natif sauf que l'on doit utiliser les variables d'environnements :20B et 02>JJ*0>43187 pour spcifier la chane de dveloppement croise . Pour configurer le noyau on utilisera la commande suivante: ) ma$e :20B'arm 02>JJ*0>43187'arm-linu&- menuconfig Pour le compiler on utilisera la commande suivante. ) ma$e :20B'arm 02>JJ*0>43187'arm-linu&- dep "1mage modules Enfin pour installer les modules sur un rpertoire image de la cible, on utilisera la commande suivante. ) ma$e :20B'arm 02>JJ*0>43187'arm-linu&- 1@JA:88*4>+*3:AB'/target*arm modules*install Programme gdbserver Ce programme permet de dboguer un programme excut sur la cible depuis le poste de dveloppement travers un lien rseau ou RS-232. Pour gnrer la version ARM on utilisera les commandes suivantes dans le rpertoire des sources de gdbserver. 15 $ ./configure --#ost'arm-linu& $ ma$e Dbogueur GDB crois Un tel outil permettra de dboguer distance un programme excut sur une cible ARM via l'outil prcdent. $ ./configure Rprefi&'/opt/crosstool/arm --target'arm-linu& --program- prefi&'arm-linu&- $ ma$e Dbogueur GDB natif ARM La commande suivante permet de construire une version de gdb directement utilisable sur la cible ARM. $ ./configure --#ost'arm-linu& Rprefi&'/usr/local/bin $ ma$e Bibliothque NCURSES native ARM Nous construisons ici une version ARM de la bibliothque NCURSES qui pourra tre ajoute la chane de compilation. $ KM18+*00'gcc 00'arm-linu&-gcc configure R#ost'arm-linu& --prefi&'/opt/crosstool/arm/arm-linu& --(it#-s#ared $ ma$e 16