{"id":957,"date":"2011-07-10T00:50:15","date_gmt":"2011-07-09T23:50:15","guid":{"rendered":"http:\/\/www.blaess.fr\/christophe\/?p=957"},"modified":"2011-07-10T00:50:15","modified_gmt":"2011-07-09T23:50:15","slug":"957","status":"publish","type":"post","link":"https:\/\/www.blaess.fr\/christophe\/2011\/07\/10\/957\/","title":{"rendered":"Compilation de Linux avec une toolchain embarqu\u00e9e native"},"content":{"rendered":"<p style=\"text-align: justify;\">Nous avons compil\u00e9 dans le <a title=\"Cr\u00e9ation et installation d\u2019une toolchain native pour processeur Arm\" href=\"http:\/\/www.blaess.fr\/christophe\/2011\/07\/01\/creation-et-installation-dune-toolchain-native-pour-processeur-arm\/\" target=\"_blank\">pr\u00e9c\u00e9dent article<\/a> une <em>toolchain<\/em> embarqu\u00e9e native, c&rsquo;est-\u00e0-dire la cha\u00eene de compilation qui pourra s&rsquo;ex\u00e9cuter sur une cible embarqu\u00e9e (\u00e0 processeur Arm dans notre cas) et qui sera susceptible de produire du code pour ce m\u00eame processeur Arm.<\/p>\n<p style=\"text-align: justify;\">Nous allons valider le fonctionnement de cette cha\u00eene de compilation en lui soumettant un gros morceau de code&nbsp;: <strong>le noyau Linux<\/strong>.<\/p>\n<p>\n<!--more-->\n<\/p>\n<p style=\"text-align: justify;\">Pour cela, commen\u00e7ons par copier les sources du noyau sur la cible. Pour cela, j&rsquo;ai ins\u00e9r\u00e9 la carte micro-SD de la Pandaborard directement dans le PC de compilation, et j&rsquo;y t\u00e9l\u00e9charge le noyau&nbsp;:<\/p>\n<pre>[~]# <strong>cd \/media\/root\/root\/<\/strong>\n[root]# <strong>wget<a title=\" http:\/\/www.kernel.org\/pub\/linux\/kernel\/v2.6\/linux-2.6.39.tar.gz\" href=\" http:\/\/www.kernel.org\/pub\/linux\/kernel\/v2.6\/linux-2.6.39.tar.gz\"> http:\/\/www.kernel.org\/pub\/linux\/kernel\/v2.6\/linux-2.6.39.tar.gz<\/a><\/strong>\n--2011-07-10 01:41:36--  http:\/\/www.kernel.org\/pub\/linux\/kernel\/v2.6\/linux-2.6.39.tar.gz\n[...]\n2011-07-10 01:43:12 (984 KB\/s) - \u201clinux-2.6.39.tar.gz\u201d saved [95993809\/95993809]\n[root]# <strong>cd ..\/..<\/strong>\n[media]# <strong>umount \/media\/*oot<\/strong><\/pre>\n<p style=\"text-align: justify;\">Puis, je d\u00e9marre la Pandaboard (apr\u00e8s y avoir r\u00e9ins\u00e9r\u00e9 la m\u00e9moire flash) et je m&rsquo;y connecte.<\/p>\n<pre>[media]# <strong>telnet 192.168.3.152<\/strong>\nTrying 192.168.3.152...\nConnected to 192.168.3.152.\nEscape character is '^]'.\n(none) login: <strong>root<\/strong>\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>cd \/root\/<\/strong>\n[PANDABOARD]$ <strong>ls<\/strong>\nhello                hello.c              linux-2.6.39.tar.gz\n[PANDABOARD]$<\/pre>\n<p style=\"text-align: justify;\">Nous retrouvons l&rsquo;exemple \u00ab\u00a0hello\u00a0\u00bb de l&rsquo;article pr\u00e9c\u00e9dent. La version de <code>tar<\/code> que j&rsquo;ai compil\u00e9e dans ma Busybox ne conna\u00eet pas les options \u00ab\u00a0z\u00a0\u00bb ou \u00ab\u00a0j\u00a0\u00bb pour d\u00e9compresser les archives <code>.gz<\/code> ou <code>.bz2<\/code>. Aussi je d\u00e9compresse d&rsquo;abord manuellement le fichier.<\/p>\n<pre>[PANDABOARD]$ <strong>gunzip  linux-2.6.39.tar.gz <\/strong>\n[PANDABOARD]$ <strong>tar xf linux-2.6.39.tar <\/strong>\n[PANDABOARD]$<\/pre>\n<p style=\"text-align: justify;\">\u00c9tant donn\u00e9 que je cherche \u00e0 valider ma cha\u00eene de compilation, et non ma configuration du noyau, je vais utiliser comme fichier de configuration <code>.config<\/code> celui de mon syst\u00e8me en cours de fonctionnement. Pour cela, je vais utiliser l&rsquo;entr\u00e9e <code>\/proc\/config.gz<\/code> qui permet de r\u00e9cup\u00e9rer la configuration du noyau en marche. Cette entr\u00e9e n&rsquo;est pas toujours disponible &#8211; notamment la plupart des distributions ne la proposent pas &#8211; et c&rsquo;est dommage. Pour activer la pr\u00e9sence de \/proc\/config.gz, il faut activer l&rsquo;option \u00ab\u00a0Kernel .config Support\u00a0\u00bb dans le menu \u00ab\u00a0General Setup\u00a0\u00bb lors de la compilation du noyau.<\/p>\n<pre>[PANDABOARD]$ <strong>cd linux-2.6.39\/<\/strong>\n[PANDABOARD]$ <strong>zcat \/proc\/config.gz &gt; .config<\/strong>\n[PANDABOARD]$<\/pre>\n<p style=\"text-align: justify;\">Avant de lancer la compilation, il est n\u00e9cessaire de mettre la carte Pandaboard \u00e0 l&rsquo;heure. Par d\u00e9faut elle s&rsquo;initialise \u00e0 l&rsquo;heure Unix z\u00e9ro (1er janvier 1970 \u00e0 minuit), et la commande <code>make<\/code> se basant sur les horodatages des fichiers, la compilation peut poser des probl\u00e8mes.<\/p>\n<pre>[PANDABOARD]$ <strong>date -s 2011.07.10-02:00<\/strong>\nSun Jul 10 02:00:00 UTC 2011\n[PANDABOARD]$<\/pre>\n<p style=\"text-align: justify;\">La commande <code>make oldconfig<\/code> g\u00e9n\u00e8re les fichiers de d\u00e9pendances \u00e0 partir du <code>.config<\/code> existant. Il est possible d&rsquo;\u00e9diter le fichier <code>.config<\/code> \u00e0 la main pour y faire d&rsquo;\u00e9ventuelles modifications (la commande habituelle <code>make menuconfig<\/code> ne fonctionnera pas \u00e0 cause de l&rsquo;absence de la biblipth\u00e8que nCurses sur la cible). Entre autre, l&rsquo;option <code>CONFIG_LOCALVERSION=<\/code> peut \u00eatre renseign\u00e9e pour indiquer un nom sp\u00e9cifique \u00e0 ajouter en suffixe au num\u00e9ro de noyau. Ici j&rsquo;ai utilis\u00e9 la cha\u00eene <code>pandanatif<\/code>.<\/p>\n<pre>[PANDABOARD]$ <strong>make ARCH=arm oldconfig<\/strong>\n  HOSTCC  scripts\/basic\/fixdep\n  HOSTCC  scripts\/basic\/docproc\n  HOSTCC  scripts\/kconfig\/conf.o\n  HOSTCC  scripts\/kconfig\/kxgettext.o\n  SHIPPED scripts\/kconfig\/zconf.tab.c\n  SHIPPED scripts\/kconfig\/lex.zconf.c\n  SHIPPED scripts\/kconfig\/zconf.hash.c\n  HOSTCC  scripts\/kconfig\/zconf.tab.o\n  HOSTLD  scripts\/kconfig\/conf\nscripts\/kconfig\/conf --oldconfig Kconfig\n#\n# configuration written to .config\n#\n[PANDABOARD]$<\/pre>\n<p style=\"text-align: justify;\">Nous lan\u00e7ons la compilation en tirant parti des deux coeurs de la Pandaboard, en demandant \u00e0 <code>make<\/code> de parall\u00e9liser son travail sur quatre jobs.<\/p>\n<pre>[PANDABOARD]$ <strong>make ARCH=arm -j 4 <\/strong>\nscripts\/kconfig\/conf --silentoldconfig Kconfig\n  CHK     include\/linux\/version.h\n  UPD     include\/linux\/version.h\n  CHK     include\/generated\/utsrelease.h\n[...]\u00a0\n  LD [M]  net\/bluetooth\/bluetooth.ko\n  AS      arch\/arm\/boot\/compressed\/piggy.gzip.o\n  LD      arch\/arm\/boot\/compressed\/vmlinux\n  OBJCOPY arch\/arm\/boot\/zImage\n  Kernel: arch\/arm\/boot\/zImage is ready\n[PANDABOARD]$<\/pre>\n<p style=\"text-align: justify;\">Nous avons obtenu ici une \u00ab\u00a0zImage\u00a0\u00bb, c&rsquo;est-\u00e0-dire une image brute compress\u00e9e et pr\u00e9fix\u00e9e par un petit auto-d\u00e9compresseur. Toutefois, le bootloader de la carte Pandaboard attend une uImage, une image format\u00e9e pour U-boot. Pour l&rsquo;obtenir il suffit de le demander \u00e0 la chaine de compilation du noyau. Toutefois celle-ci s&rsquo;appuie sur un petit utilitaire, <code>mkimage<\/code>, qui n&rsquo;est pas pr\u00e9sent sur le syst\u00e8me minimal construit avec Busybox.<br \/>\nPour compiler <code>mkimage<\/code>, nous devons t\u00e9l\u00e9charger les sources de U-boot et y chercher ce petit outil. T\u00e9l\u00e9chargeons les sources dans le r\u00e9pertoire <code>\/root<\/code> de notre cible (en montant la carte micro-SD sur l&rsquo;h\u00f4te de d\u00e9veloppement).<\/p>\n<pre>[root]# <strong>cd \/media\/root\/root\/<\/strong>\n[root]# <strong>wget ftp:\/\/ftp.denx.de\/pub\/u-boot\/u-boot-2011.06.tar.bz2<\/strong>\n--2011-07-10 08:09:50--  ftp:\/\/ftp.denx.de\/pub\/u-boot\/u-boot-2011.06.tar.bz2\n[...]\n2011-07-10 08:10:00 (996 KB\/s) - \u201cu-boot-2011.06.tar.bz2\u201d saved [8469694]\n[root]# <strong>cd ..\/..<\/strong>\n[media]# <strong>umount \/media\/*oot<\/strong>\n[media]#<\/pre>\n<p style=\"text-align: justify;\">Apr\u00e8s avoir red\u00e9marr\u00e9 la Pandaboard (et pens\u00e9 \u00e0 la remettre \u00e0 l&rsquo;heure) pr\u00e9parons les sources de U-Boot&nbsp;:<\/p>\n<pre>[PANDABOARD]$ <strong>cd \/root\/<\/strong>\n[PANDABOARD]$ <strong>bunzip2 u-boot-2011.06.tar.bz2<\/strong>\n[PANDABOARD]$ <strong>tar xf u-boot-2011.06.tar<\/strong>\ntar: warning: skipping header 'g'\n[PANDABOARD]$<\/pre>\n<p style=\"text-align: justify;\">La compilation que nous lan\u00e7ons n&rsquo;a pour unique but que la pr\u00e9paration de l&rsquo;utilitaire <code>mkimage<\/code>. Je vous conseille de vous connecter sur un second terminal, et de surveiller le r\u00e9pertoire <code>\/root\/u-boot-2001-06\/tools<\/code>. D\u00e8s que l&rsquo;ex\u00e9cutable <code>mkimage<\/code> est pr\u00e9sent, on peut arr\u00eater la compilation compl\u00e8te de U-Boot.<\/p>\n<pre>[PANDABOARD]$ <strong>make OMAP4_PANDA_config<\/strong>\nawk '(NF &amp;&amp; $1 !~ \/^#\/) { print $1 \": \" $1 \"_config; $(MAKE)\" }' boards.cfg &gt; .boards.depend\nGenerating include\/autoconf.mk\nGenerating include\/autoconf.mk.dep\nConfiguring for omap4_panda board...\n[PANDABOARD]$ <strong>make<\/strong>\nGenerating include\/autoconf.mk\nGenerating include\/autoconf.mk.dep\ngcc -DDO_DEPS_ONLY \n                -g  -Os   -fno-common -ffixed-r8 -msoft-float   -D__KERNEL__ -DCONFIG_SYS_TEXT_BASE=0x80e80000 -I\/root\/u-boot-2011.06\/include -fno-builtin -ffreestanding -nostdinc -isystem \/usr\/lib\/gcc\/arm-unknown-linux-uclibcgnueabi\/4.3.5\/include -pipe  -DCONFIG_ARM -D__ARM__ -marm  -mabi=aapcs-linux -mno-thumb-interwork -march=armv5 -Wall -Wstrict-prototypes -fno-stack-protector   \n                -o lib\/asm-offsets.s lib\/asm-offsets.c -c -S\n[...]\ndrivers\/video\/libvideo.o drivers\/watchdog\/libwatchdog.o fs\/cramfs\/libcramfs.o fs\/ext2\/libext2fs.o fs\/fat\/libfat.o fs\/fdos\/libfdos.o fs\/jffs2\/libjffs2.o fs\/reiserfs\/libreiserfs.o fs\/ubifs\/libubifs.o fs\/yaffs2\/libyaffs2.o lib\/libfdt\/libfdt.o lib\/libgeneric.o lib\/lzma\/liblzma.o lib\/lzo\/liblzo.o lib\/zlib\/libz.o net\/libnet.o post\/libpost.o board\/ti\/panda\/libpanda.o --end-group \/root\/u-boot-2011.06\/arch\/arm\/lib\/eabi_compat.o -L \/usr\/lib\/gcc\/arm-unknown-linux-uclibcgnueabi\/4.3.5 -lgcc -Map u-boot.map -o u-boot\nobjcopy -O srec u-boot u-boot.srec\nobjcopy --gap-fill=0xff -O binary u-boot u-boot.bin\n[PANDABOARD]$<\/pre>\n<p style=\"text-align: justify;\">Notre utilitaire \u00e9tant pr\u00eat, installons-le dans un r\u00e9pertoire syst\u00e8me, puis retournons dans les sources de Linux pour obtenir une <code>uImage<\/code>.<\/p>\n<pre>[PANDABOARD]$ <strong>cp tools\/mkimage \/usr\/bin\/<\/strong>\n[PANDABOARD]$ <strong>cd \/root\/linux-2.6.39\/<\/strong>\n[PANDABOARD]$ <strong>make uImage<\/strong>\n  CHK     include\/linux\/version.h\n  CHK     include\/generated\/utsrelease.h\nmake[1]: `include\/generated\/mach-types.h' is up to date.\n  CALL    scripts\/checksyscalls.sh\n  CHK     include\/generated\/compile.h\n  Kernel: arch\/arm\/boot\/Image is ready\n  SHIPPED arch\/arm\/boot\/compressed\/lib1funcs.S\n  AS      arch\/arm\/boot\/compressed\/lib1funcs.o\n  LD      arch\/arm\/boot\/compressed\/vmlinux\n  OBJCOPY arch\/arm\/boot\/zImage\n  Kernel: arch\/arm\/boot\/zImage is ready\n  UIMAGE  arch\/arm\/boot\/uImage\nImage Name:   Linux-2.6.39-pandanatif\nCreated:      Sun Jul 10 08:30:58 2011\nImage Type:   ARM Linux Kernel Image (uncompressed)\nData Size:    3048144 Bytes = 2976.70 kB = 2.91 MB\nLoad Address: 80008000\nEntry Point:  80008000\n  Image arch\/arm\/boot\/uImage is ready\n[PANDABOARD]$<\/pre>\n<p style=\"text-align: justify;\">Installons le noyau sur la partition de boot en la montant dans l&rsquo;arborescence et en y copiant la nouvelle <code>uImage<\/code>.<\/p>\n<pre>[PANDABOARD]$ <strong>mount \/dev\/mmcblk0p1 \/mnt\/<\/strong>\n[PANDABOARD]$ <strong>cp \/mnt\/uImage \/mnt\/uImage-precedent<\/strong>\n[PANDABOARD]$ <strong>cp arch\/arm\/boot\/uImage \/mnt\/<\/strong>\n[PANDABOARD]$ <strong>umount \/dev\/mmcblk0p1 <\/strong>\n[PANDABOARD]$ <strong>reboot<\/strong>\nConnection closed by foreign host.\n[media]#<\/pre>\n<p style=\"text-align: justify;\">Apr\u00e8s red\u00e9marrage de la carte Pandaboard, re-connectons nous et v\u00e9rifions la version du noyau en fonctionnement&#8230;<\/p>\n<pre>[media]# <strong>telnet 192.168.3.152<\/strong>\nTrying 192.168.3.152...\nConnected to 192.168.3.152.\nEscape character is '^]'.\n(none) login: <strong>root<\/strong>\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>uname -a<\/strong>\nLinux (none) 2.6.39-pandanatif #1 SMP Sun Jul 10 02:36:03 UTC 2011 armv7l GNU\/Linux\n[PANDABOARD]$<\/pre>\n<p style=\"text-align: justify;\">Et voil\u00e0&nbsp;! Notre cible embarqu\u00e9e est devenue relativement autonome, puisqu&rsquo;elle est capable de fonctionner sur un noyau recompil\u00e9 sur cette m\u00eame cible. Ceci nous permet de valider le fonctionnement de la cha\u00eene de compilation obtenue dans l&rsquo;article pr\u00e9c\u00e9dent. Remarquons toutefois que cette <em>toochain<\/em> pourrait \u00eatre \u00e9tendue car nous n&rsquo;avons int\u00e9gr\u00e9 aucun outil de d\u00e9bogage (<code>gdb<\/code>, <code>gdbserver<\/code>, etc.)<\/p>","protected":false},"excerpt":{"rendered":"<p>Nous avons compil&eacute; dans le pr&eacute;c&eacute;dent article une toolchain embarqu&eacute;e native, c&rsquo;est-&agrave;-dire la cha&icirc;ne de compilation qui pourra s&rsquo;ex&eacute;cuter sur une cible embarqu&eacute;e (&agrave; processeur Arm dans notre cas) et qui sera susceptible de produire du code pour ce m&ecirc;me processeur Arm. Nous allons valider le fonctionnement de cette cha&icirc;ne de compilation en lui soumettant [&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-957","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\/957","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=957"}],"version-history":[{"count":0,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts\/957\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/media?parent=957"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/categories?post=957"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/tags?post=957"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}