Вы находитесь на странице: 1из 16

Compilation croise sous Linux et Windows

Pierre Ficheux (pierre.ficheux@openwide.fr)


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

Вам также может понравиться