{"id":936,"date":"2011-07-01T12:00:48","date_gmt":"2011-07-01T11:00:48","guid":{"rendered":"http:\/\/www.blaess.fr\/christophe\/?p=936"},"modified":"2011-07-01T12:00:48","modified_gmt":"2011-07-01T11:00:48","slug":"creation-et-installation-dune-toolchain-native-pour-processeur-arm","status":"publish","type":"post","link":"https:\/\/www.blaess.fr\/christophe\/2011\/07\/01\/creation-et-installation-dune-toolchain-native-pour-processeur-arm\/","title":{"rendered":"Cr\u00e9ation et installation d&rsquo;une toolchain native pour processeur Arm"},"content":{"rendered":"<p style=\"text-align: justify;\">Certains projets posent des probl\u00e8mes difficiles \u00e0 surmonter lorsqu&rsquo;il s&rsquo;agit de les <em>cross-compiler<\/em> pour une plate-forme diff\u00e9rente du poste de compilation. Citons par exemple Apache ou PHP que nous avons laborieusement r\u00e9ussi \u00e0 cross-compiler dans les <a title=\"Construire son syst\u00e8me personnel sur une carte Pandaboard (4)\" href=\"http:\/\/www.blaess.fr\/christophe\/2011\/06\/10\/construire-son-systeme-personnel-sur-une-carte-pandaboard-4\/\">quatri\u00e8me<\/a> et <a title=\"Construire son syst\u00e8me personnel sur carte Pandaboard (5)\" href=\"http:\/\/www.blaess.fr\/christophe\/2011\/06\/17\/construire-son-systeme-personnel-sur-carte-pandaboard-5\/\">cinqui\u00e8me<\/a> articles de notre s\u00e9rie \u00ab\u00a0<em>Construire son syst\u00e8me personnel sur Pandaboard<\/em>\u00ab\u00a0. Il peut \u00eatre utile de disposer sur la cible embarqu\u00e9e d&rsquo;une cha\u00eene de compilation <strong>native<\/strong> c&rsquo;est-\u00e0-dire capable de produire du code ex\u00e9cutable pour le processeur sur lequel la compilation a eu lieu.<\/p>\n<p style=\"text-align: justify;\">Nous allons mettre ceci en oeuvre sur une carte \u00e0 processeur Arm \u00e0 l&rsquo;aide de <strong><em>Buildroot<\/em>.<\/strong><\/p>\n<p>\n<!--more-->\n<\/p>\n<p style=\"text-align: justify;\">Je vous propose de proc\u00e9der en deux \u00e9tapes&nbsp;: g\u00e9n\u00e9ration de la cha\u00eene de compilation crois\u00e9e classique, puis une fois celle-ci pr\u00eate, construction de la cha\u00eene de compilation native. Comme toujours, il faudra intervenir un peu manuellement pour r\u00e9ussir toute la compilation&#8230;<\/p>\n<p style=\"text-align: justify;\">Tout d&rsquo;abord t\u00e9l\u00e9chargeons et d\u00e9compressons les sources de Buildroot&nbsp;:<\/p>\n<pre>[~]$ <strong>mkdir Projets\/Arm\/<\/strong>\n[~]$ <strong>cd Projets\/Arm\/<\/strong>\n[Arm]$ <strong>wget http:\/\/buildroot.uclibc.org\/downloads\/buildroot-2011.05.tar.bz2<\/strong>\n--2011-06-30 23:22:45--\u00a0 http:\/\/buildroot.uclibc.org\/downloads\/buildroot-2011.05.tar.bz2\n[...]\n2011-06-30 23:22:50 (522 KB\/s) - \u00abbuildroot-2011.05.tar.bz2\u00bb sauvegard\u00e9 [1834679\/1834679]\n[Arm]$ <strong>tar -xjf buildroot-2011.05.tar.bz2<\/strong>\n[Arm]$ <strong>cd buildroot-2011.05<\/strong>\n[buildroot-2011.05]$<\/pre>\n<p style=\"text-align: justify;\">Je vous propose de t\u00e9l\u00e9charger <a title=\"http:\/\/www.blaess.fr\/christophe\/files\/article-2011-07-01\/config-buildroot-2011-05-pass-1\" href=\"http:\/\/www.blaess.fr\/christophe\/files\/article-2011-07-01\/config-buildroot-2011-05-pass-1\">ce fichier de configuration<\/a> qui va g\u00e9n\u00e9rer la cha\u00eene de compilation crois\u00e9e et installer dans les r\u00e9pertoires destin\u00e9s \u00e0 la cible les fichiers d&rsquo;ent\u00eate de la biblioth\u00e8que C (option <em>Development files in target filesystem<\/em> du menu <em>Build Options<\/em> ci-dessous).<\/p>\n<pre>[buildroot-2011.05]$ <strong>cp ~\/<a title=\"http:\/\/www.blaess.fr\/christophe\/files\/article-2011-07-01\/config-buildroot-2011-05-pass-1\" href=\"http:\/\/www.blaess.fr\/christophe\/files\/article-2011-07-01\/config-buildroot-2011-05-pass-1\">config-buildroot-2011-05-pass-1<\/a> .\/.config<\/strong>\n[buildroot-2011.05]$ <strong>make menuconfig<\/strong>\n[...]<\/pre>\n<p style=\"text-align: justify;\">V\u00e9rifiez en particulier les chemins mentionn\u00e9s dans le menu \u00ab\u00a0Build Options\u00a0\u00bb, pour qu&rsquo;il soient en accord avec votre syst\u00e8me. Le r\u00e9pertoire \u00ab\u00a0Host Dir\u00a0\u00bb doit \u00eatre un chemin absolu (il contiendra donc probablement votre nom d&rsquo;utilisateur plut\u00f4t que le mien&nbsp;!). Quittez le menu et lancez la compilation&nbsp;:<\/p>\n<pre>[buildroot-2011.05]$ <strong>make<\/strong>\n[...]<\/pre>\n<p style=\"text-align: justify;\">Pendant la compilation, <code>make<\/code> nous pose une dizaines de questions (probablement de nouvelles options qui ne sont pas enregistr\u00e9es dans le fichier <code>.config<\/code>), auxquelles nous pouvons r\u00e9pondre en utilisant le choix par d\u00e9faut, c&rsquo;est-\u00e0-dire en pressant simplement <em>Entr\u00e9e<\/em>.<\/p>\n<pre>[...]\n\t\tgrep -qx $lang \/home\/cpb\/Projets\/Arm\/buildroot-2011.05\/output\/build\/locales.nopurge || rm -rf $dir\/$lang; \n\tdone; \ndone\nrm -f \/home\/cpb\/Projets\/Arm\/buildroot-2011.05\/output\/build\/.fakeroot*\n[buildroot-2011.05]$<\/pre>\n<p style=\"text-align: justify;\">La premi\u00e8re \u00e9tape est termin\u00e9e nous avons une cha\u00eene de compilation crois\u00e9e, contenant GCC, accessible ainsi&nbsp;:<\/p>\n<pre>[buildroot-2011.05]$ <strong>~\/Projets\/Arm\/Target\/usr\/bin\/arm-linux-gcc -v<\/strong>\nUtilisation des specs internes.\nTarget: arm-unknown-linux-uclibcgnueabi\nConfigur\u00e9 avec: \/home\/cpb\/Projets\/Arm\/buildroot-2011.05\/output\/toolchain\/gcc-4.3.5\/configure --prefix=\/home\/cpb\/Projets\/Arm\/Target\/usr --build=i686-pc-linux-gnu --host=i686-pc-linux-gnu --target=arm-unknown-linux-uclibcgnueabi --enable-languages=c,c++ --with-sysroot=\/home\/cpb\/Projets\/Arm\/Target\/usr\/arm-unknown-linux-uclibcgnueabi\/sysroot --with-build-time-tools=\/home\/cpb\/Projets\/Arm\/Target\/usr\/arm-unknown-linux-uclibcgnueabi\/bin --disable-__cxa_atexit --enable-target-optspace --disable-libgomp --with-gnu-ld --disable-libssp --disable-multilib --disable-tls --enable-shared --with-gmp=\/home\/cpb\/Projets\/Arm\/Target\/usr --with-mpfr=\/home\/cpb\/Projets\/Arm\/Target\/usr --enable-threads --disable-decimal-float --with-abi=aapcs-linux --with-pkgversion='Buildroot 2011.05' --with-bugurl=http:\/\/bugs.buildroot.net\/\nMod\u00e8le de thread: posix\ngcc version 4.3.5 (Buildroot 2011.05)\n[buildroot-2011.05]$<\/pre>\n<p style=\"text-align: justify;\">Passons \u00e0 la seconde phase, la compilation d&rsquo;un environnement de d\u00e9veloppement natif pour notre syst\u00e8me embarqu\u00e9 en utilisant <a title=\"http:\/\/www.blaess.fr\/christophe\/files\/article-2011-07-01\/config-buildroot-2011-05-pass-2\" href=\"http:\/\/www.blaess.fr\/christophe\/files\/article-2011-07-01\/config-buildroot-2011-05-pass-2\">ce fichier<\/a> de configuration.<\/p>\n<pre>[buildroot-2011.05]$ <strong>cp ..\/<a title=\"http:\/\/www.blaess.fr\/christophe\/files\/article-2011-07-01\/config-buildroot-2011-05-pass-1\" href=\"http:\/\/www.blaess.fr\/christophe\/files\/article-2011-07-01\/config-buildroot-2011-05-pass-1\">config-buildroot-2011-05-pass-2<\/a> .\/.config<\/strong>\n[buildroot-2011.05]$ <strong>make menuconfig<\/strong><\/pre>\n<p style=\"text-align: justify;\">Vous pourrez remarquer que nous avons ins\u00e9r\u00e9 plusieurs outils de d\u00e9veloppement comme Bison, Flex, Make, Gcc, et m\u00eame l&rsquo;interpr\u00e9teur Microperl, qui comme son nom l&rsquo;indique impl\u00e9mente un sous-ensemble (assez cons\u00e9quent) du langage Perl.<\/p>\n<pre>[buildroot-2011.05]$ <strong>make <\/strong>\n[...]\n-DDEPENDS_ON_LIBINTL=1 -DEXEEXT=\"\" -Os -pipe -Os -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -c csharpcomp.c -o csharpcomp.o &gt;\/dev\/null 2&gt;&amp;1\nmake[5] : on quitte le r\u00e9pertoire \u00ab \/home\/cpb\/Projets\/Arm\/buildroot-2011.05\/output\/build\/gettext-0.16.1\/gettext-tools\/gnulib-lib \u00bb\nmake[4]: *** [all] Erreur 2\nmake[4] : on quitte le r\u00e9pertoire \u00ab \/home\/cpb\/Projets\/Arm\/buildroot-2011.05\/output\/build\/gettext-0.16.1\/gettext-tools\/gnulib-lib \u00bb\nmake[3]: *** [all-recursive] Erreur 1\nmake[3] : on quitte le r\u00e9pertoire \u00ab \/home\/cpb\/Projets\/Arm\/buildroot-2011.05\/output\/build\/gettext-0.16.1\/gettext-tools \u00bb\nmake[2]: *** [all] Erreur 2\nmake[2] : on quitte le r\u00e9pertoire \u00ab \/home\/cpb\/Projets\/Arm\/buildroot-2011.05\/output\/build\/gettext-0.16.1\/gettext-tools \u00bb\nmake[1]: *** [all-recursive] Erreur 1\nmake[1] : on quitte le r\u00e9pertoire \u00ab \/home\/cpb\/Projets\/Arm\/buildroot-2011.05\/output\/build\/gettext-0.16.1 \u00bb\nmake: *** [\/home\/cpb\/Projets\/Arm\/buildroot-2011.05\/output\/build\/gettext-0.16.1\/gettext-runtime\/src\/gettext] Erreur 2\n[buildroot-2011.05]$<\/pre>\n<p style=\"text-align: justify;\">Comment&nbsp;? Une erreur de compilation&nbsp;? Quelle surprise&nbsp;!<\/p>\n<p style=\"text-align: justify;\">La cause apparait un peu plus haut dans les traces&nbsp;:<\/p>\n<pre> \/home\/cpb\/Projets\/Arm\/Target\/usr\/bin\/arm-unknown-linux-uclibcgnueabi-gcc -DHAVE_CONFIG_H -DEXEEXT=\"\" -DEXEEXT=\"\" -I. -I.. -I..\/intl -I..\/intl -I..\/intl -I.. -I.. -DDEPENDS_ON_LIBICONV=1 -DDEPENDS_ON_LIBINTL=1 -DEXEEXT=\"\" -Os -pipe -Os -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -c copy-file.c  -fPIC -DPIC -o .libs\/copy-file.o\ncopy-file.c:35:25: error: sys\/utime.h: No such file or directory\nmake[5]: *** [copy-file.lo] Erreur 1<\/pre>\n<p style=\"text-align: justify;\">Un fichier <code>utime.h<\/code> ne se trouve pas dans le bon r\u00e9pertoire. Classique. Cherchons-le.<\/p>\n<pre>[buildroot-2011.05]$ <strong>find . -name 'utime.h'<\/strong>\n.\/output\/toolchain\/uClibc-0.9.31\/include\/utime.h\n.\/output\/toolchain\/uClibc_dev\/usr\/include\/linux\/utime.h\n.\/output\/toolchain\/linux\/include\/linux\/utime.h\n.\/output\/toolchain\/linux-2.6.38.7\/include\/linux\/utime.h\n[buildroot-2011.05]$<\/pre>\n<p style=\"text-align: justify;\">Nous ne prendrons pas les deux derni\u00e8res instances, elles sont r\u00e9serv\u00e9es \u00e0 la compilation de modules du noyau, mais plut\u00f4t la premi\u00e8re. A pr\u00e9sent nous voyons que le compilateur cherche ce fichier dans un sous-r\u00e9pertoire <code>sys\/<\/code> or il n&rsquo;y en a pas dans les r\u00e9pertoires de recherches des fichiers d&rsquo;ent\u00eate lors de la compilation de <code>copy-file.c<\/code>.<br \/>\nNous allons devoir faire une petite op\u00e9ration manuelle avant de relancer la compilation.<\/p>\n<pre>[buildroot-2011.05]$ <strong>mkdir -p output\/build\/gettext-0.16.1\/gettext-tools\/gnulib-lib\/sys<\/strong>\n[buildroot-2011.05]$ <strong>cp output\/toolchain\/uClibc-0.9.31\/include\/utime.h output\/build\/gettext-0.16.1\/gettext-tools\/gnulib-lib\/sys\/<\/strong>\n[buildroot-2011.05]$ <strong>make<\/strong><\/pre>\n<p style=\"text-align: justify;\">A vrai dire, la commande <code>make<\/code> s&rsquo;est \u00e0 nouveau interrompue en erreur sur mon syst\u00e8me. Toutefois, soup\u00e7onnant une erreur due \u00e0 la compilation en parall\u00e8le (8 jobs), j&rsquo;ai relanc\u00e9 simplement <code>make<\/code> qui a fonctionn\u00e9.<\/p>\n<pre>[...]\ndo \n\t\tgrep -qx $lang \/home\/cpb\/Projets\/Arm\/buildroot-2011.05\/output\/build\/locales.nopurge || rm -rf $dir\/$lang; \n\tdone; \ndone\nrm -f \/home\/cpb\/Projets\/Arm\/buildroot-2011.05\/output\/build\/.fakeroot*\n[buildroot-2011.05]$ <strong>ls output\/target\/usr\/bin\/<\/strong>\naddr2line  as     c++  c++filt  elfedit  g++  gccbug  gprof  ld      ldd   microperl  objcopy  perl    readelf  strings  yacc\nar         bison  cc   cpp      flex     gcc  gcov    iconv  ld.bfd  make  nm         objdump  ranlib  size     strip\n[buildroot-2011.05]$<strong> file output\/target\/usr\/bin\/gcc<\/strong>\noutput\/target\/usr\/bin\/gcc: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), stripped\n[buildroot-2011.05]$<\/pre>\n<p style=\"text-align: justify;\">Pour tester notre <em>toolchain<\/em> native, nous allons l&rsquo;installer sur un syst\u00e8me Pandaboard, contenant simplement un noyau Linux et une Busybox intr\u00e9grant une connexion \u00e0 distante par <code>telnet<\/code>. Apr\u00e8s avoir ins\u00e9r\u00e9 la carte micro-SD sur mon PC, je vais copier le contenu du r\u00e9pertoire <code>~\/Projets\/Arm\/buildroot-2011.05\/output\/target\/usr\/<\/code> sur la cible&nbsp;:<\/p>\n<pre>[buildroot-2011.05]$ <strong>cp -R output\/target\/usr\/* \/media\/root\/usr\/<\/strong>\n[buildroot-2011.05]$ <strong>umount \/media\/root\/<\/strong>\n[buildroot-2011.05]$<\/pre>\n<p style=\"text-align: justify;\">Apr\u00e8s avoir ins\u00e9r\u00e9 la micro-SD dans la carte Pandaboard, laissons-la <em>booter<\/em>, puis connectons-nous dessus via le r\u00e9seau.<\/p>\n<pre>[buildroot-2011.05]$ <strong>telnet 192.168.3.152<\/strong>\nTrying 192.168.3.152...\nConnected to 192.168.3.152.\n(none) login: root\nPassword:\nBusyBox v1.18.4 (2011-06-22 12:27:46 CEST) built-in shell (ash)\nEnter 'help' for a list of built-in commands.\n[PANDABOARD]$  <strong>vi \/root\/hello.c<\/strong><\/pre>\n<p style=\"text-align: justify;\">A l&rsquo;aide du petit \u00e9diteur <code>vi<\/code> int\u00e9gr\u00e9 dans Busybox, nous saissons un petit programme de test<\/p>\n<pre style=\"padding-left: 30px;\">#include &lt;stdio.h&gt;\n\nint main(void)\n{\n        fprintf(stdout, \"Hello from the native Panda Compiler !n\");\n        return 0;\n}<\/pre>\n<p style=\"text-align: justify;\">Que nous compilons ainsi&nbsp;:<\/p>\n<pre>[PANDABOARD]$ <strong>gcc \/root\/hello.c -o \/root\/hello<\/strong>\n[PANDABOARD]$ <strong>\/root\/hello<\/strong>\nHello from the native Panda Compiler !\n[PANDABOARD]$<\/pre>\n<p style=\"text-align: justify;\">Voil\u00e0&nbsp;! notre compilateur natif est pr\u00eat. Il manque encore quelques utilitaires pour se lancer dans une compilation de plus grande envergure (le noyau Linux par exemple), nous les verrons la semaine prochaine.<\/p>\n<p style=\"text-align: justify;\">PS&nbsp;: Cet article est plus court que d&rsquo;habitude, mais cette p\u00e9riode est tr\u00e8s charg\u00e9e pour moi&nbsp;: plusieurs d\u00e9veloppements importants arrivant \u00e0 leurs termes, un d\u00e9m\u00e9nagement, et quelques nouveaux projets traitant de robotique et de micro-contr\u00f4leurs (que je d\u00e9velopperai prochainement)&#8230;<\/p>","protected":false},"excerpt":{"rendered":"<p>Certains projets posent des probl&egrave;mes difficiles &agrave; surmonter lorsqu&rsquo;il s&rsquo;agit de les cross-compiler pour une plate-forme diff&eacute;rente du poste de compilation. Citons par exemple Apache ou PHP que nous avons laborieusement r&eacute;ussi &agrave; cross-compiler dans les quatri&egrave;me et cinqui&egrave;me articles de notre s&eacute;rie &laquo;&nbsp;Construire son syst&egrave;me personnel sur Pandaboard&laquo;&nbsp;. Il peut &ecirc;tre utile de disposer [&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,10],"tags":[],"class_list":["post-936","post","type-post","status-publish","format-standard","hentry","category-embarque","category-linux-2","category-microprocesseur"],"_links":{"self":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts\/936","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=936"}],"version-history":[{"count":0,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts\/936\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/media?parent=936"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/categories?post=936"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/tags?post=936"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}