{"id":655,"date":"2011-05-27T12:00:06","date_gmt":"2011-05-27T11:00:06","guid":{"rendered":"http:\/\/www.blaess.fr\/christophe\/?p=655"},"modified":"2011-05-27T12:00:06","modified_gmt":"2011-05-27T11:00:06","slug":"buildroot-vs-crosstool-ng-compilons-notre-cross-compiler","status":"publish","type":"post","link":"https:\/\/www.blaess.fr\/christophe\/2011\/05\/27\/buildroot-vs-crosstool-ng-compilons-notre-cross-compiler\/","title":{"rendered":"Buildroot vs Crosstool-NG &#8211; Compilons notre cross-compiler"},"content":{"rendered":"<p style=\"text-align: justify;\">Lorsqu&rsquo;on entame un projet de d\u00e9veloppement sur Linux embarqu\u00e9, il est n\u00e9cessaire de disposer d&rsquo;un <em>cross-compiler<\/em> (souvent traduit un peu maladroitement par le terme \u00ab\u00a0compilateur crois\u00e9\u00a0\u00bb ) c&rsquo;est-\u00e0-dire un compilateur fonctionnant sur la machine de d\u00e9veloppement (appel\u00e9 poste <em>h\u00f4te<\/em>) capable de produire des fichiers ex\u00e9cutables qui pourront s&rsquo;ex\u00e9cuter sur le processeur du syst\u00e8me embarqu\u00e9 (la <em>cible<\/em>). Ce compilateur est g\u00e9n\u00e9ralement mis \u00e0 disposition (gratuitement ou non) par le fournisseur de la carte embarqu\u00e9e. Toutefois, il y a de nombreux cas o\u00f9 l&rsquo;on aimerait pouvoir choisir sa propre cha\u00eene de compilation, pour des raisons de compatibilit\u00e9 entre outils ou entre biblioth\u00e8ques par exemple.<\/p>\n<p style=\"text-align: justify;\">La g\u00e9n\u00e9ration du cross-compiler a longtemps \u00e9t\u00e9 une op\u00e9ration compliqu\u00e9e, longue et fastidieuse, mais de nos jours plusieurs projets encadrent cette \u00e9tape pr\u00e9liminaire et simplifient grandement la vie des d\u00e9veloppeurs pour l&#8217;embarqu\u00e9.<\/p>\n<p>\n<!--more-->\n<\/p>\n<p style=\"text-align: justify;\">J&rsquo;ai choisi de comparer deux approches diff\u00e9rentes (m\u00eame si au final les \u00e9tapes de compilation sont assez proches)&nbsp;: <em>Crosstool-NG<\/em> et <em>Buildroot<\/em>. Sachez cependant qu&rsquo;il existe encore bien d&rsquo;autres projets du m\u00eame genre, comme <em>Scratchbox<\/em>, <em>Open embedded<\/em>, etc.<\/p>\n<ul>\n<li style=\"text-align: justify;\"><em>Crosstool-NG<\/em> est un outil qui nous permet de g\u00e9n\u00e9rer notre cha\u00eene de compilation crois\u00e9e. Apr\u00e8s une phase de configuration relativement simple, il t\u00e9l\u00e9charge les packages n\u00e9cessaires, puis les compile et construit une <em>toolchain<\/em> compl\u00e8te.<\/li>\n<li style=\"text-align: justify;\"><em>Buildroot<\/em> est un projet plus vaste, qui g\u00e9n\u00e8re le compilateur crois\u00e9, mais peut ensuite encha\u00eener sur la compilation du noyau, des utilitaires de base, des biblioth\u00e8ques suppl\u00e9mentaires, du syst\u00e8me de fichiers, etc. Nous allons nous limiter ici (c&rsquo;est la configuration que j&rsquo;ai pr\u00e9par\u00e9e) \u00e0 la production du <em>cross-compiler<\/em>.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p style=\"text-align: justify;\">Toute application qui fonctionne sur Linux a besoin, soit au moment de la compilation, soit au moment de l&rsquo;ex\u00e9cution, d&rsquo;une biblioth\u00e8que C. Cette derni\u00e8re ne se cantonne nullement aux fonctions utilitaires du langage C, mais contient aussi tous les points d&rsquo;acc\u00e8s \u00e0 l&rsquo;API du noyau (les appels-syst\u00e8me). M\u00eame une application \u00e9crite en Ada ou en Fortran aura besoin d&rsquo;acc\u00e9der \u00e0 cette partie de la biblioth\u00e8que C. Il s&rsquo;agit donc d&rsquo;une pi\u00e8ce cruciale du syst\u00e8me Linux, aussi importante que le kernel lui-m\u00eame.<\/p>\n<p style=\"text-align: justify;\">Il existe plusieurs versions de biblioth\u00e8que C. Les plus courantes sont&nbsp;:<\/p>\n<ul>\n<li style=\"text-align: justify;\">la <strong>GlibC<\/strong> (<em>Gnu libC<\/em>), tr\u00e8s compl\u00e8te, tr\u00e8s riche, tr\u00e8s grosse. Il en existe une variante un peu all\u00e9g\u00e9e&nbsp;: la <strong>EglibC<\/strong><\/li>\n<li style=\"text-align: justify;\">la <strong>uClibC<\/strong> beaucoup plus petite, mais n&rsquo;impl\u00e9mentant pas toujours les extensions trop r\u00e9centes de la Glibc, ou les fonctionnalit\u00e9s non-standard.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p style=\"text-align: justify;\">Le choix d&rsquo;une biblioth\u00e8que doit \u00eatre \u00e9tabli d\u00e8s la conception initiale du projet, puisqu&rsquo;il influe sur la g\u00e9n\u00e9ration de la <em>toolchain<\/em>. Buildroot ne sait compiler que la uClibC, en revanche Crosstool-NG peut compiler une GlibC, une EglibC \u00a0ou une uClibC. Nous allons pr\u00e9parer deux cha\u00eenes de compilation diff\u00e9rentes, toutes les deux pour processeurs Arm, en employant ces deux projets successivement.<\/p>\n<h1>Crosstool-NG<\/h1>\n<p style=\"text-align: justify;\">T\u00e9l\u00e9chargeons et d\u00e9compressons les sources de crosstool-ng<\/p>\n<pre>[~]$ <strong>mkdir tmp<\/strong>\n[~]$ <strong>cd tmp<\/strong>\n[tmp]$ <strong>wget <a title=\"http:\/\/crosstool-ng.org\/download\/crosstool-ng\/crosstool-ng-1.11.1.tar.bz2\" href=\"http:\/\/crosstool-ng.org\/download\/crosstool-ng\/crosstool-ng-1.11.1.tar.bz2\">http:\/\/crosstool-ng.org\/download\/crosstool-ng\/crosstool-ng-1.11.1.tar.bz2<\/a><\/strong>\n--2011-05-07 09:38:28--  http:\/\/crosstool-ng.org\/download\/crosstool-ng\/crosstool-ng-1.11.1.tar.bz2\n[...]\n2011-05-07 09:38:31 (564 KB\/s) - \u00abcrosstool-ng-1.11.1.tar.bz2\u00bb sauvegard\u00e9 [1838987\/1838987]\n[tmp]$ <strong>tar xjf crosstool-ng-1.11.1.tar.bz2<\/strong>\n[tmp]$ <strong>cd crosstool-ng-1.11.1<\/strong><\/pre>\n<p style=\"text-align: justify;\">Configurons Crosstool-NG pour pr\u00e9parer la compilation. Nous allons indiquer un chemin (absolu, pas de chemin relatif ou de <code>~\/<\/code>) pour l&rsquo;installation des scripts de compilation. Ce r\u00e9pertoire pourra \u00eatre supprim\u00e9 par la suite.<\/p>\n<pre>[crosstool-ng-1.11.1]$ <strong>.\/configure --prefix=\/home\/<span style=\"text-decoration: underline;\">votre-login<\/span>\/tmp\/ctng<\/strong>\nChecking for 'grep'... \/bin\/grep\nChecking whether '\/bin\/grep' supports -E... yes\n[...]\n[crosstool-ng-1.11.1]$ <strong>make<\/strong>\n  SED    'ct-ng'\n  SED    'scripts\/crosstool-NG.sh'\n[...]\n  SED    'docs\/ct-ng.1'\n  GZIP   'docs\/ct-ng.1.gz'\n[crosstool-ng-1.11.1]$ <strong>make install<\/strong>\n  MKDIR   '\/home\/cpb\/tmp\/ctng\/bin\/'\n  INST    'ct-ng'\n[...]\nFor auto-completion, do not forget to install 'ct-ng.comp' into\nyour bash completion directory (usually \/etc\/bash_completion.d)\n[crosstool-ng-1.11.1]$<\/pre>\n<p style=\"text-align: justify;\">Si la commande <code>configure<\/code> se plaint de l&rsquo;absence de <code>makeinfo<\/code>, sachez qu&rsquo;il s&rsquo;agit du package <code>texinfo<\/code> qu&rsquo;il faut installer.<\/p>\n<p style=\"text-align: justify;\">Nous pouvons \u00e0 pr\u00e9sent supprimer ce r\u00e9pertoire de sources, et cr\u00e9er un r\u00e9pertoire de travail dans lequel seront stock\u00e9s les fichiers temporaires pendant la g\u00e9n\u00e9ration du <em>cross-compiler<\/em>.<\/p>\n<pre>[crosstool-ng-1.11.1]$ <strong>cd ..<\/strong>\n[tmp]$ <strong>rm -rf crosstool-ng-1.11.1<\/strong>\n[tmp]$ <strong>mkdir ctng-build<\/strong>\n[tmp]$ <strong>cd ctng-build\/<\/strong>\n[ctng-build]$<\/pre>\n<p style=\"text-align: justify;\">Il est important d&rsquo;ajouter dans notre variable d&rsquo;environnement <code>PATH<\/code> le chemin d&rsquo;acc\u00e8s au r\u00e9pertoire <code>bin\/<\/code> dans le r\u00e9pertoire pr\u00e9c\u00e9demment fourni&nbsp;:<\/p>\n<pre>[ctng-build]$ <strong>PATH=$PATH:~\/tmp\/ctng\/bin\/<\/strong>\n[ctng-build]$<\/pre>\n<p style=\"text-align: justify;\">Nous allons maintenant\u00a0configurer la compilation. Pour cela une interface en mode texte semi-graphique semblable \u00e0 celle du noyau Linux est disponible. La configuration est enregistr\u00e9e dans un fichier <code>.config<\/code> que l&rsquo;on peut sauvegarder et restaurer manuellement. Vous en trouverez une version pr\u00eate \u00e0 t\u00e9l\u00e9charger.<\/p>\n<pre>[ctng-build]$ <strong>cp ~\/<a title=\"config-ctng-1.11.1-arm-linux-generic\" href=\"http:\/\/www.blaess.fr\/christophe\/files\/article-2011-05-27\/config-ctng-1.11.1-arm-linux-generic\">config-ctng-1.11.1-arm-linux-generic<\/a> .\/.config<\/strong>\n[ctng-build]$ <strong>ct-ng menuconfig<\/strong>\n  MKDIR kconfig\n  DEP   kconfig\/lxdialog\/menubox.dep\n  DEP   kconfig\/lxdialog\/textbox.dep\n[...]<\/pre>\n<p style=\"text-align: justify;\">Apr\u00e8s examen des options disponibles, quittons en sauvegardant la configuration, puis lan\u00e7ons la compilation&nbsp;:<\/p>\n<pre>[ctng-build]$ <strong>ct-ng build<\/strong>\n[INFO ]  Performing some trivial sanity checks\n[INFO ]  Build started 20110507.100411\n[INFO ]  Building environment variables\n[WARN ]  Directory '\/home\/cpb\/tmp\/download' does not exist.\n[WARN ]  Will not save downloaded tarballs to local storage.\n[INFO ]  =================================================================\n[INFO ]  Retrieving needed toolchain components' tarballs\n[INFO ]  Retrieving needed toolchain components' tarballs: done in 727.77s (at 12:09)\n[INFO ]  =================================================================\n[INFO ]  Extracting and patching toolchain components\n[INFO ]  Extracting and patching toolchain components: done in 73.42s (at 13:22)\n[INFO ]  =================================================================\n[INFO ]  Installing binutils\n[INFO ]  Installing binutils: done in 33.22s (at 13:55)\n[INFO ]  =================================================================\n[INFO ]  Installing static core C compiler\n[INFO ]  Installing static core C compiler: done in 75.13s (at 15:11)\n[INFO ]  =================================================================\n[INFO ]  Installing kernel headers\n[INFO ]  Installing kernel headers: done in 5.10s (at 15:16)\n[INFO ]  =================================================================\n[INFO ]  Installing C library headers &amp; start files\n[INFO ]  Installing C library headers &amp; start files: done in 79.14s (at 16:35)\n[INFO ]  =================================================================\n[INFO ]  Installing shared core C compiler\n[INFO ]  Installing shared core C compiler: done in 112.33s (at 18:27)\n[INFO ]  =================================================================\n[INFO ]  Installing C library\n[INFO ]  Installing C library: done in 463.23s (at 26:10)\n[INFO ]  =================================================================\n[INFO ]  Installing final compiler\n[INFO ]  Installing final compiler: done in 85.82s (at 27:36)\n[INFO ]  =================================================================\n[INFO ]  Installing cross-gdb\n[INFO ]  Installing cross-gdb: done in 83.66s (at 29:00)\n[INFO ]  =================================================================\n[INFO ]  Installing gdbserver\n[INFO ]  Installing gdbserver: done in 7.75s (at 29:08)\n[INFO ]  =================================================================\n[INFO ]  Cleaning-up the toolchain's directory\n[INFO ]    Stripping all toolchain executables\n[INFO ]  Cleaning-up the toolchain's directory: done in 1.26s (at 29:09)\n[INFO ]  Build completed at 20110507.103320\n[INFO ]  (elapsed: 29:08.89)\n[INFO ]  Finishing installation (may take a few seconds)...\n[ctng-build]$ <strong>cd ..<\/strong>\n[tmp]$ <strong>rm -rf ctng*<\/strong>\n[tmp]$<\/pre>\n<p style=\"text-align: justify;\">Et voil\u00e0&nbsp;! notre nouvelle <em>toolchain<\/em> est pr\u00eate, disponible dans <code>~\/cross-arm-linux-ctng\/bin<\/code>, les utilitaires \u00e9tant pr\u00e9fix\u00e9s par <code>arm-generic-linux-gnueabi-<\/code><\/p>\n<h2>Utilisation du cross-compiler<\/h2>\n<p style=\"text-align: justify;\">Nous allons employer toolchain obtenue avec Crosstool-NG pour compiler un noyau Linux et une application utilisateur (Busybox par exemple). J&rsquo;utiliserai ici des fichiers de configuration fonctionnant pour la carte Pandaboard.<\/p>\n<h3>Compilation du kernel Linux<\/h3>\n<p style=\"text-align: justify;\">T\u00e9l\u00e9chargement et pr\u00e9paration des sources&nbsp;:<\/p>\n<pre>[~]$ <strong>cd tmp<\/strong>\n[tmp]$ <strong>wget <a title=\"http:\/\/www.kernel.org\/pub\/linux\/kernel\/v2.6\/testing\/linux-2.6.39-rc6.tar.bz2\" href=\"http:\/\/www.kernel.org\/pub\/linux\/kernel\/v2.6\/testing\/linux-2.6.39-rc6.tar.bz2\">http:\/\/www.kernel.org\/pub\/linux\/kernel\/v2.6\/testing\/linux-2.6.39-rc6.tar.bz2<\/a><\/strong>\n[...]\n2011-05-08 03:40:59 (1,60 MB\/s) - \u00ablinux-2.6.39-rc6.tar.bz2\u00bb sauvegard\u00e9 [76087903\/76087903]\n[tmp]$ <strong>tar -xjf linux-2.6.39-rc6.tar.bz2 <\/strong>\n[tmp]$ <strong>cd linux-2.6.39-rc6<\/strong><\/pre>\n<p style=\"text-align: justify;\">Configuration de la compilation&nbsp;; le fichier propos\u00e9 ci-dessous est une configuration pour la carte Pandaboard que j&rsquo;ai utilis\u00e9e dans les articles des semaines pr\u00e9c\u00e9dentes (<a title=\"Construire son syst\u00e8me personnel sur une carte Pandaboard (1)\" href=\"http:\/\/www.blaess.fr\/christophe\/2011\/05\/06\/construire-son-systeme-personnel-sur-une-carte-pandaboard\/\">1<\/a>, <a title=\"Construire son syst\u00e8me personnel sur une carte Pandaboard (2)\" href=\"http:\/\/www.blaess.fr\/christophe\/2011\/05\/13\/construire-son-systeme-personnel-sur-une-carte-pandaboard-2\/\">2<\/a>, et <a title=\"Construire son syst\u00e8me personnel sur une carte Pandaboard (3)\" href=\"http:\/\/www.blaess.fr\/christophe\/2011\/05\/20\/construire-son-systeme-personnel-sur-une-carte-pandaboard-3\/\">3<\/a>)<\/p>\n<pre>[linux-2.6.39-rc6]$ <strong>cp ~\/<a title=\"config-linux-2.6.39-rc6-pandaboard-cpb\" href=\"http:\/\/www.blaess.fr\/christophe\/files\/article-2011-05-27\/config-linux-2.6.39-rc6-pandaboard-cpb\">config-linux-2.6.39-rc6-pandaboard-cpb<\/a> .\/.config<\/strong>\n[linux-2.6.39-rc6]$ <strong>make ARCH=arm menuconfig<\/strong><\/pre>\n<p style=\"text-align: justify;\">Apr\u00e8s avoir v\u00e9rifi\u00e9 la configuration, nous quittons et lan\u00e7ons la compilation ainsi&nbsp;:<\/p>\n<pre>[linux-2.6.39-rc6]$ <strong>PATH=$PATH:~\/Projets\/Panda\/u-boot\/tools\/<\/strong>\n[linux-2.6.39-rc6]$ <strong>make ARCH=arm CROSS_COMPILE=~\/cross-arm-linux-ctng\/bin\/arm-generic-linux-gnueabi- -j 16 uImage<\/strong><\/pre>\n<p style=\"text-align: justify;\">Deux remarques&nbsp;:<\/p>\n<ul>\n<li style=\"text-align: justify;\">La modification du <code>PATH<\/code> permet d&rsquo;inclure le r\u00e9pertoire dans lequel nous avions compil\u00e9 U-boot, afin d&rsquo;avoir acc\u00e8s \u00e0 l&rsquo;utilitaire <code>mkimage<\/code> qui permet de produire des fichiers <code>uImage<\/code>. Pour en savoir plus, se reporter \u00e0 <a title=\"Construire son syst\u00e8me personnel sur une carte Pandaboard (1)\" href=\"http:\/\/www.blaess.fr\/christophe\/2011\/05\/06\/construire-son-systeme-personnel-sur-une-carte-pandaboard\/\" target=\"_blank\">cet article<\/a>.<\/li>\n<li style=\"text-align: justify;\">Il est possible d&rsquo;enregistrer le pr\u00e9fixe du <em>cross-compiler<\/em> directement dans la configuration du kernel (dans le menu <em>General Setup<\/em>), mais j&rsquo;ai pr\u00e9f\u00e9r\u00e9 indiquer ce pr\u00e9fixe explicitement sur la ligne de commande, car nous r\u00e9-utiliserons le m\u00eame fichier de configuration pour comparer la compilation avec Buildroot.<\/li>\n<\/ul>\n<p style=\"text-align: justify;\">La compilation se termine ainsi&nbsp;:<\/p>\n<pre>Image Name:   Linux-2.6.39-rc6-cpb-ctng\nCreated:      Sun May  8 03:52:04 2011\nImage Type:   ARM Linux Kernel Image (uncompressed)\nData Size:    3053156 Bytes = 2981.60 kB = 2.91 MB\nLoad Address: 80008000\nEntry Point:  80008000\n  Image arch\/arm\/boot\/uImage is ready\n[linux-2.6.39-rc6]$ <strong>ls -l arch\/arm\/boot\/uImage <\/strong>\n-rw-rw-r-- 1 cpb cpb 3053220  8 mai   03:52 arch\/arm\/boot\/uImage\n[linux-2.6.39-rc6]$<\/pre>\n<p style=\"text-align: justify;\">Apr\u00e8s avoir sauvegard\u00e9 l&rsquo;image obtenue, passons un petit coup de \u00ab\u00a0M. Propre\u00a0\u00bb sur les sources du noyau afin d&rsquo;effacer tous les fichiers de compilation<\/p>\n<pre>[linux-2.6.39-rc6]$ <strong>cp arch\/arm\/boot\/uImage ~\/tmp\/uImage-ctng<\/strong>\n[linux-2.6.39-rc6]$ <strong>make mrproper<\/strong>\n  CLEAN   .\n[...]\n  CLEAN   .config .config.old .version include\/linux\/version.h Module.symvers\n[linux-2.6.39-rc6]$<\/pre>\n<h3>Compilation de busybox<\/h3>\n<p style=\"text-align: justify;\">Busybox est un package essentiel pour les syst\u00e8mes embarqu\u00e9s, que l&rsquo;on retrouve dans de tr\u00e8s nombreux projets.<\/p>\n<pre>[~]$ <strong>cd tmp<\/strong>\n[tmp]$ <strong>wget <a title=\"http:\/\/www.busybox.net\/downloads\/busybox-1.18.4.tar.bz2\" href=\"http:\/\/www.busybox.net\/downloads\/busybox-1.18.4.tar.bz2\">http:\/\/www.busybox.net\/downloads\/busybox-1.18.4.tar.bz2<\/a><\/strong>\n[...]\n2011-05-08 03:59:21 (523 KB\/s) - \u00abbusybox-1.18.4.tar.bz2\u00bb sauvegard\u00e9 [2130598\/2130598]\n[tmp]$ <strong>tar -xjf busybox-1.18.4.tar.bz2<\/strong>\n[tmp]$ <strong>cd busybox-1.18.4<\/strong>\n[busybox-1.18.4]$<\/pre>\n<p style=\"text-align: justify;\">Le fichier de configuration fourni ici est tr\u00e8s complet, ceci nous donnera un fichier ex\u00e9cutable assez volumineux<\/p>\n<pre>[busybox-1.18.4]$ <strong>cp ~\/<a title=\"config-busybox-1.18.4\" href=\"http:\/\/www.blaess.fr\/christophe\/files\/article-2011-05-27\/config-busybox-1.18.4\" target=\"_blank\">config-busybox-1.18.4<\/a> .\/.config<\/strong>\n[busybox-1.18.4]$ <strong>make CROSS_COMPILE=~\/cross-arm-linux-ctng\/bin\/arm-generic-linux-gnueabi-<\/strong>\n[...]\n  AR      shell\/lib.a\n  AR      libbb\/lib.a\n  LINK    busybox_unstripped\nTrying libraries: crypt m\n Library crypt is not needed, excluding it\n Library m is needed, can't exclude it (yet)\nFinal link with: m\n[busybox-1.18.4]$ <strong>ls -l busybox<\/strong>\n-rwxrwxr-x 1 cpb cpb 896108  8 mai   04:07 busybox\n[busybox-1.18.4]$ <strong>cp busybox ~\/tmp\/busybox-ctng<\/strong>[busybox-1.18.4]$<\/pre>\n<p style=\"text-align: justify;\">Pour que ce fichier ex\u00e9cutable puisse fonctionner, il faudra disposer sur la cible&nbsp;:<\/p>\n<ul>\n<li style=\"text-align: justify;\">du chargeur de fichiers ex\u00e9cutables dynamiques <code>ld-linux.so.3<\/code> (lien symbolique vers <code>ld-2.12.2.so<\/code>)&nbsp;;<\/li>\n<li style=\"text-align: justify;\">de la biblioth\u00e8que C&nbsp;: <code>libc.so.6<\/code> (lien symbolique vers <code>libc-2.12.2.so<\/code>)&nbsp;;<\/li>\n<li style=\"text-align: justify;\">de la biblioth\u00e8que math\u00e9matique <code>libm.so.6<\/code> (lien symbolique vers <code>libm-2.12.2.so<\/code>).<\/li>\n<\/ul>\n<p style=\"text-align: justify;\">Tous ces fichiers ont \u00e9t\u00e9 compil\u00e9s avec la <em>toolchain<\/em> et se trouvent dans\u00a0<code>~\/cross-arm-linux-ctng\/arm-generic-linux-gnueabi\/sysroot\/lib\/<\/code>. Voyons leurs tailles&nbsp;:<\/p>\n<pre>[lib]$ <strong>ls -l ld-2.12.2.so <\/strong>\n-r-xr-xr-x 1 cpb cpb 161023  7 mai   10:30 ld-2.12.2.so\n[lib]$ <strong>ls -l libc-2.12.2.so <\/strong>\n-r-xr-xr-x 1 cpb cpb 1521599  7 mai   10:30 libc-2.12.2.so\n[lib]$ <strong>ls -l libm-2.12.2.so <\/strong>\n-r-xr-xr-x 1 cpb cpb 729489  7 mai   10:29 libm-2.12.2.so\n[lib]$<\/pre>\n<p style=\"text-align: justify;\">Au total, il nous faudra installer sur notre cible au minimum&nbsp;:<\/p>\n<ul>\n<li style=\"text-align: justify;\">kernel Linux&nbsp;:\u00a03053220 octets\u00a0\u2248 3Mo<\/li>\n<li>ex\u00e9cutable Busybox&nbsp;: 896108 octets\u00a0\u2248 1 Mo<\/li>\n<li style=\"text-align: justify;\">biblioth\u00e8ques&nbsp;: 161023 + 1521599 + 729489 =\u00a02412111 octets\u00a0\u2248 2,3 Mo<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p style=\"text-align: justify; padding-left: 90px;\">Soit un total d&rsquo;environ 6 Mo.<\/p>\n<h1>Buildroot<\/h1>\n<p style=\"text-align: justify;\">Obtention et pr\u00e9paration des sources de Buildroot&nbsp;:<\/p>\n<pre>[~]$ <strong>cd tmp<\/strong>\n[tmp]$ <strong>wget <a title=\"http:\/\/buildroot.uclibc.org\/downloads\/buildroot-2011.02.tar.bz2\" href=\"http:\/\/buildroot.uclibc.org\/downloads\/buildroot-2011.02.tar.bz2\">http:\/\/buildroot.uclibc.org\/downloads\/buildroot-2011.02.tar.bz2<\/a><\/strong>\n[...]\n2011-05-08 04:28:58 (492 KB\/s) - \u00abbuildroot-2011.02.tar.bz2\u00bb sauvegard\u00e9 [1945895\/1945895]\n[tmp]$ <strong>tar xjf buildroot-2011.02.tar.bz2<\/strong>\n[tmp]$ <strong>cd buildroot-2011.02<\/strong>\n[buildroot-2011.02]$<\/pre>\n<p style=\"text-align: justify;\">Configuration de la compilation&nbsp;:<\/p>\n<pre>[buildroot-2011.02]$ <strong>cp ~\/<a title=\"config-buildroot-arm-generic\" href=\"http:\/\/www.blaess.fr\/christophe\/files\/article-2011-05-27\/config-buildroot-arm-generic\">config-buildroot-arm-generic<\/a> .\/.config<\/strong>\n[buildroot-2011.02]$ <strong>make menuconfig<\/strong><\/pre>\n<p style=\"text-align: justify;\">Dans le menu de configuration, nous devons pr\u00e9ciser l&#8217;emplacement final de la toolchain par un <strong>chemin absolu<\/strong>. Il faut donc modifier l&rsquo;entr\u00e9e \u00ab\u00a0<em>Host dir<\/em>\u00a0\u00bb du menu \u00ab\u00a0<em>Build Options<\/em>\u00a0\u00bb pour qu&rsquo;elle contienne le r\u00e9pertoire d&rsquo;installation du compilateur (remplacez mon nom de login \u00ab\u00a0cpb\u00a0\u00bb par le v\u00f4tre).<\/p>\n<p style=\"text-align: justify;\">Puis on lance la compilation&nbsp;:<\/p>\n<pre>[buildroot-2011.02]$ <strong>make<\/strong>\n[...]\nif [ -x \"\/home\/cpb\/cross-arm-linux-buildroot\/usr\/bin\/arm-unknown-linux-uclibcgnueabi-ldconfig\" ]; \nthen \n\t\/home\/cpb\/cross-arm-linux-buildroot\/usr\/bin\/arm-unknown-linux-uclibcgnueabi-ldconfig -r \/home\/cpb\/tmp\/buildroot-2011.02\/output\/target; \nelse \n\t\/sbin\/ldconfig -r \/home\/cpb\/tmp\/buildroot-2011.02\/output\/target; \nfi\n\/home\/cpb\/cross-arm-linux-buildroot\/usr\/bin\/arm-unknown-linux-uclibcgnueabi-ldconfig: can't resolve \/usr\/X11R6\/lib in chroot .: No such file or directory\n\/home\/cpb\/cross-arm-linux-buildroot\/usr\/bin\/arm-unknown-linux-uclibcgnueabi-ldconfig: skipping \/usr\/X11R6\/lib: No such file or directory\necho 2011.02 &gt; \/home\/cpb\/tmp\/buildroot-2011.02\/output\/target\/etc\/br-version\nrm -f \/home\/cpb\/tmp\/buildroot-2011.02\/output\/build\/.fakeroot*\n[buildroot-2011.02]$ <strong>cd ..<\/strong>\n[tmp]$ <strong>rm -rf buildroot-2011.02*<\/strong>\n[tmp]$<\/pre>\n<h2>Utilisation de Buildroot<\/h2>\n<p style=\"text-align: justify;\">Commen\u00e7ons par compiler un noyau Linux comme pr\u00e9c\u00e9demment (nous avions nettoy\u00e9 les sources de tous les fichiers de compilation pr\u00e9c\u00e9dents)&nbsp;:<\/p>\n<pre>[~]$ <strong>cd tmp\/<\/strong>\n[tmp]$ <strong>cd linux-2.6.39-rc6<\/strong>\n[linux-2.6.39-rc6]$ <strong>cp ~\/config-linux-2.6.39-rc6-pandaboard-cpb .\/.config<\/strong>\n[linux-2.6.39-rc6]$ <strong>make ARCH=arm menuconfig<\/strong>\n  HOSTCC  scripts\/basic\/fixdep\n  HOSTCC  scripts\/basic\/docproc\n[...]<\/pre>\n<p style=\"text-align: justify;\">V\u00e9rifions la configuration et sauvegardons-la&nbsp;:<\/p>\n<pre>#\n# configuration written to .config\n[...]\n[linux-2.6.39-rc6]$ <strong>PATH=$PATH:~\/Projets\/Panda\/u-boot\/tools\/<\/strong>\n[linux-2.6.39-rc6]$ <strong>make ARCH=arm CROSS_COMPILE=~\/cross-arm-linux-buildroot\/usr\/bin\/arm-linux- -j 16 uImage<\/strong>\n[...]\nImage Name:   Linux-2.6.39-rc6-cpb-buildroot\nCreated:      Sun May  8 09:31:34 2011\nImage Type:   ARM Linux Kernel Image (uncompressed)\nData Size:    3050288 Bytes = 2978.80 kB = 2.91 MB\nLoad Address: 80008000\nEntry Point:  80008000\n  Image arch\/arm\/boot\/uImage is ready\n[linux-2.6.39-rc6]$ <strong>ls -l arch\/arm\/boot\/uImage <\/strong>\n-rw-rw-r-- 1 cpb cpb 3050352  8 mai   09:31 arch\/arm\/boot\/uImage\n[linux-2.6.39-rc6]$ <strong>cp arch\/arm\/boot\/uImage ..\/uImage-buildroot<\/strong>\n[linux-2.6.39-rc6]$<\/pre>\n<p style=\"text-align: justify;\">La taille du noyau est approximativement \u00e9gale \u00e0 celle du noyau obtenu avec Crosstool-NG.\u00a0V\u00e9rifions \u00e0 pr\u00e9sent la compilation d&rsquo;une application utilisateur&nbsp;: Busybox.<\/p>\n<pre>[linux-2.6.39-rc6]$ <strong>cd ~\/tmp\/busybox-1.18.4<\/strong>\n[busybox-1.18.4]$ <strong>make distclean<\/strong>\n  CLEAN   applets\n[...]\n  CLEAN   .config include\/autoconf.h include\/bbconfigopts.h include\/usage_compressed.h include\/applet_tables.h\n[busybox-1.18.4]$ <strong>cp ~\/config-busybox-1.18.4 .\/.config<\/strong>\n[busybox-1.18.4]$ <strong>make menuconfig<\/strong><\/pre>\n<p style=\"text-align: justify;\">Puis compilons Busybox&nbsp;:<\/p>\n<pre>[busybox-1.18.4]$ <strong>make CROSS_COMPILE=~\/cross-arm-linux-buildroot\/usr\/bin\/arm-linux- <\/strong>\n[...]\nTrying libraries: crypt m\n Library crypt is not needed, excluding it\n Library m is needed, can't exclude it (yet)\nFinal link with: m\n  DOC     busybox.pod\n  DOC     BusyBox.txt\n  DOC     busybox.1\n  DOC     BusyBox.html\n[busybox-1.18.4]$\n[busybox-1.18.4]$ ls -l busybox\n-rwxrwxr-x 1 cpb cpb 892444  8 mai   09:38 busybox<\/pre>\n<p>Les biblioth\u00e8ques utiles se trouvent \u00e0 pr\u00e9sent dans <code>~\/cross-arm-linux-buildroot\/usr\/arm-linux\/sysroot\/lib\/<\/code><\/p>\n<pre>[cross-arm-linux-buildroot]$ <strong>ls -l \/cross-arm-linux\/usr\/arm-linux\/sysroot\/lib\/ld-uClibc-0.9.31.so <\/strong>\n-rwxr-xr-x 1 root root 21324  8 mai   04:55 \/cross-arm-linux\/usr\/arm-linux\/sysroot\/lib\/ld-uClibc-0.9.31.so\n[cross-arm-linux-buildroot]$ <strong>ls -l \/cross-arm-linux\/usr\/arm-linux\/sysroot\/lib\/libuClibc-0.9.31.so<\/strong>\n-rwxr-xr-x 1 root root 403651  8 mai   04:55 \/cross-arm-linux\/usr\/arm-linux\/sysroot\/lib\/libuClibc-0.9.31.so\n[cross-arm-linux-buildroot]$ <strong>ls -l \/cross-arm-linux\/usr\/arm-linux\/sysroot\/lib\/libm-0.9.31.so<\/strong>\n-rwxr-xr-x 1 root root 64479  8 mai   04:55 \/cross-arm-linux\/usr\/arm-linux\/sysroot\/lib\/libm-0.9.31.so<\/pre>\n<p style=\"text-align: justify;\">Nous pouvons r\u00e9capituler les \u00e9l\u00e9ments n\u00e9cessaires<\/p>\n<ul>\n<li style=\"text-align: justify;\">kernel Linux&nbsp;:\u00a03050288 octets\u00a0\u2248 3Mo<\/li>\n<li style=\"text-align: justify;\">ex\u00e9cutable Busybox&nbsp;: 892444 octets\u00a0\u2248 1 Mo<\/li>\n<li style=\"text-align: justify;\">biblioth\u00e8ques&nbsp;: 21324 + 403651 + 64479 =\u00a0489454 octets\u00a0\u2248 478 ko<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p style=\"text-align: justify; padding-left: 60px;\">Soit environ 4,4 Mo<\/p>\n<h1 style=\"text-align: justify;\">Conclusion<\/h1>\n<p style=\"text-align: justify;\">Comme on pouvait s&rsquo;y attendre la taille des biblioth\u00e8ques n\u00e9cessaires en utilisant la uClibC est sensiblement plus petite que celle de la EglibC. En revanche les tailles des ex\u00e9cutables (avec \u00e9ditions des liens dynamique) et du noyau Linux sont \u00e9quivalentes \u00e0 celles obtenues avec la toolchain de Crosstool-NG.<\/p>\n<p style=\"text-align: justify;\">Il y a des diff\u00e9rences fonctionnelles entre les biblioth\u00e8ques EglibC (ou GlibC) et uClibC. Cette derni\u00e8re par exemple s&rsquo;appuie encore pour offrir un support des <em>threads<\/em> Posix sur l&rsquo;ancienne biblioth\u00e8que <em>LinuxThreads<\/em>, alors que la EglibC utilisent la biblioth\u00e8que <em>NPTL<\/em> plus riche et plus performante. C&rsquo;est le cas pour d&rsquo;autres fonctionnalit\u00e9s \u00e9galement (cela fera l&rsquo;objet d&rsquo;un prochain article).<\/p>\n<p style=\"text-align: justify;\">Sur des syst\u00e8mes fortement contraints, o\u00f9 l&rsquo;\u00e9conomie de quelques m\u00e9ga-octets est appr\u00e9ciable, on pourra se tourner facilement vers la uClibC \u00e0 l&rsquo;aide de Buildroot. Sur des syst\u00e8mes moins limit\u00e9s en m\u00e9moire, on pourra profiter de la richesse de la GlibC en utilisant le compilateur crois\u00e9 fourni par Crosstool-NG.<\/p>\n<p>&nbsp;<\/p>","protected":false},"excerpt":{"rendered":"<p>Lorsqu&rsquo;on entame un projet de d&eacute;veloppement sur Linux embarqu&eacute;, il est n&eacute;cessaire de disposer d&rsquo;un cross-compiler (souvent traduit un peu maladroitement par le terme &laquo;&nbsp;compilateur crois&eacute;&nbsp;&raquo; ) c&rsquo;est-&agrave;-dire un compilateur fonctionnant sur la machine de d&eacute;veloppement (appel&eacute; poste h&ocirc;te) capable de produire des fichiers ex&eacute;cutables qui pourront s&rsquo;ex&eacute;cuter sur le processeur du syst&egrave;me embarqu&eacute; (la [&hellip;]<\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5,8],"tags":[],"class_list":["post-655","post","type-post","status-publish","format-standard","hentry","category-embarque","category-linux-2"],"_links":{"self":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts\/655","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/comments?post=655"}],"version-history":[{"count":0,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts\/655\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/media?parent=655"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/categories?post=655"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/tags?post=655"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}