{"id":680,"date":"2018-01-06T13:05:21","date_gmt":"2018-01-06T12:05:21","guid":{"rendered":"http:\/\/www.ludovicfavre.ch\/blog\/?p=680"},"modified":"2018-01-06T14:04:06","modified_gmt":"2018-01-06T13:04:06","slug":"installation-environnement-crossdev-arm-sur-gentoo-x86-32-64","status":"publish","type":"post","link":"https:\/\/www.ludovicfavre.ch\/blog\/2018\/01\/installation-environnement-crossdev-arm-sur-gentoo-x86-32-64\/","title":{"rendered":"Installation environnement crossdev ARM sur Gentoo (x86 32\/64)"},"content":{"rendered":"<p>Il peut \u00eatre pratique d&rsquo;avoir un environnement de d\u00e9veloppement ARM utilisable directement depuis un environnement x86 lorsqu&rsquo;on ne poss\u00e8de pas d&rsquo;environnement d\u00e9di\u00e9 (p\u00e9riph\u00e9rique cible, raspberry PI par exemple) ou qu&rsquo;on ne veut pas \u00e9muler tout un syst\u00e8me d&rsquo;exploitation dans Qemu pour lancer un simple binaire.<\/p>\n<p>Les \u00e9tapes suivantes d\u00e9crivent comment installer l&rsquo;environnement de compilation (GCC) ainsi que les outils permettant d&rsquo;ex\u00e9cuter directement un binaire ARM.<\/p>\n<p><!--more--><\/p>\n<h2>Installation<\/h2>\n<h3>GCC<\/h3>\n<p>Sous <a href=\"https:\/\/wiki.gentoo.org\/wiki\/Cross_build_environment\">Gentoo, l&rsquo;installation de l&rsquo;environnement crossdev<\/a> se fait avec une simple commande:<\/p>\n<p><code class=\"codecolorer bash default\"><span class=\"bash\">&nbsp;crossdev <span class=\"re5\">-t<\/span> arm-none-eabi\u00a0<\/span><\/code><\/p>\n<p>Les packages binutils, gcc et libc sont install\u00e9s automatiquement :<\/p>\n<ul>\n<li>crossdev version: 20151026<\/li>\n<li>Host Portage ARCH: amd64<\/li>\n<li>Target Portage ARCH: arm<\/li>\n<li>Target System: arm-none-eabi<\/li>\n<li>Stage: 3 (C compiler &#038; libc)<\/li>\n<li>ABIs: default<\/li>\n<\/ul>\n<p>Les ex\u00e9cutable sont install\u00e9s avec le pr\u00e9fix:\u00a0arm-none-eabi-*, par exemple pour gcc:\u00a0<code class=\"codecolorer bash default\"><span class=\"bash\">arm-none-eabi-gcc<\/span><\/code><\/p>\n<h3>Qemu<\/h3>\n<p>Qemu va permettre d&rsquo;ex\u00e9cuter notre binaire. Il faut ajouter la cible \u00ab\u00a0arm\u00a0\u00bb dans le fichier \/etc\/make.conf :\u00a0<\/p>\n<p>QEMU_USER_TARGETS=\u00a0\u00bbi386 x86_64 arm\u00a0\u00bb<br \/>\nQEMU_SOFTMMU_TARGETS=\u00a0\u00bbi386 x86_64 arm\u00a0\u00bb<\/p>\n<h3>GDB<\/h3>\n<p>Pour pouvoir debugger un binaire, il faut \u00e9galement installer une version de GDB capable de debugger du code ARM:\u00a0<code class=\"codecolorer bash default\"><span class=\"bash\">emerge <span class=\"re5\">-av<\/span> cross-arm-none-eabi<span class=\"sy0\">\/<\/span><span class=\"kw2\">gdb<\/span><\/span><\/code><\/p>\n<h2>Compilation de code assembleur ARM<\/h2>\n<p>Le code assembleur utilis\u00e9 est un simple \u00ab\u00a0Hello world\u00a0\u00bb (fichier helloworld.s) :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n.global _start \r\n_start: \r\n  mov r7, #4 \r\n  mov r0, #1 \r\n  mov r2, #12 \r\n  ldr r1, =string \r\n  swi 0 \r\n  mov r7, #1 \r\n  swi 0 \r\n  .data \r\nstring: \r\n  .ascii &quot;Hello World\\n&quot;\r\n <\/pre>\n<p>La compilation se fait avec la commande :<\/p>\n<p><code class=\"codecolorer bash default\"><span class=\"bash\">arm-none-eabi-as <span class=\"re5\">-g<\/span> helloworld.s <span class=\"re5\">-o<\/span> helloworld.o<\/span><\/code><\/p>\n<p>puis<\/p>\n<p><code class=\"codecolorer bash default\"><span class=\"bash\">arm-none-eabi-ld helloworld.o <span class=\"re5\">-o<\/span> helloworld<\/span><\/code><\/p>\n<h2>Debug avec Qemu et GDB<\/h2>\n<p>Ex\u00e9cuter le binaire dans Qemu (en debug) :<\/p>\n<p><code class=\"codecolorer bash default\"><span class=\"bash\">qemu-arm <span class=\"re5\">-singlestep<\/span> <span class=\"re5\">-g<\/span> <span class=\"nu0\">1234<\/span> helloworld<\/span><\/code><\/p>\n<p>et dans un deuxi\u00e8me terminal, se connecter avec gdb (si vous voulez charger votre configuration dans .gdbinit, il faut retirer l&rsquo;option -nx):<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">arm-none-eabi-gdb -q -nx\r\n(gdb) file helloworld\r\nReading symbols from helloworld...done.\r\n(gdb) target remote 127.0.0.1:1234\r\nRemote debugging using 127.0.0.1:1234\r\n...<\/pre>\n<p>Nous voici connect\u00e9s en debug, avec un breakpoint \u00e0 la premi\u00e8re ligne:<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">(gdb) disass _start\r\nDump of assembler code for function _start:\r\n=&gt; 0x00008000 &lt;+0&gt;: \u00a0\u00a0\u00a0\u00a0mov \u00a0\u00a0\u00a0\u00a0r7, #4\r\n0x00008004 &lt;+4&gt;: \u00a0\u00a0\u00a0\u00a0mov \u00a0\u00a0\u00a0\u00a0r0, #1\r\n0x00008008 &lt;+8&gt;: \u00a0\u00a0\u00a0\u00a0mov \u00a0\u00a0\u00a0\u00a0r2, #12\r\n0x0000800c &lt;+12&gt;: \u00a0\u00a0\u00a0ldr \u00a0\u00a0\u00a0\u00a0r1, &#x5B;pc, #8] \u00a0\u00a0\u00a0; 0x801c &lt;_start+28&gt;\r\n0x00008010 &lt;+16&gt;: \u00a0\u00a0\u00a0svc \u00a0\u00a0\u00a0\u00a00x00000000\r\n0x00008014 &lt;+20&gt;: \u00a0\u00a0\u00a0mov \u00a0\u00a0\u00a0\u00a0r7, #1\r\n0x00008018 &lt;+24&gt;: \u00a0\u00a0\u00a0svc \u00a0\u00a0\u00a0\u00a00x00000000\r\n0x0000801c &lt;+28&gt;: \u00a0\u00a0\u00a0andeq \u00a0\u00a0r8, r1, r0, lsr #32\r\n<\/pre>\n<p>L&rsquo;environnement est ainsi fonctionnel.<\/p>\n<p>source:<br \/>\n<a href=\"https:\/\/wiki.gentoo.org\/wiki\/QEMU\">documentation QEMU Gentoo<\/a><br \/>\n<a href=\"https:\/\/wiki.gentoo.org\/wiki\/Cross_build_environment\">documentation crossdev Gentoo<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Il peut \u00eatre pratique d&rsquo;avoir un environnement de d\u00e9veloppement ARM utilisable directement depuis un environnement x86 lorsqu&rsquo;on ne poss\u00e8de pas d&rsquo;environnement d\u00e9di\u00e9 (p\u00e9riph\u00e9rique cible, raspberry PI par exemple) ou qu&rsquo;on ne veut pas \u00e9muler tout un syst\u00e8me d&rsquo;exploitation dans Qemu &hellip; <a href=\"https:\/\/www.ludovicfavre.ch\/blog\/2018\/01\/installation-environnement-crossdev-arm-sur-gentoo-x86-32-64\/\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[75,41,68],"tags":[76,80,79,77,7,65,78],"class_list":["post-680","post","type-post","status-publish","format-standard","hentry","category-arm","category-coding","category-gentoo","tag-arm","tag-asm","tag-debug","tag-gdb","tag-gentoo","tag-linux","tag-qemu"],"_links":{"self":[{"href":"https:\/\/www.ludovicfavre.ch\/blog\/wp-json\/wp\/v2\/posts\/680","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.ludovicfavre.ch\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.ludovicfavre.ch\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.ludovicfavre.ch\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.ludovicfavre.ch\/blog\/wp-json\/wp\/v2\/comments?post=680"}],"version-history":[{"count":34,"href":"https:\/\/www.ludovicfavre.ch\/blog\/wp-json\/wp\/v2\/posts\/680\/revisions"}],"predecessor-version":[{"id":716,"href":"https:\/\/www.ludovicfavre.ch\/blog\/wp-json\/wp\/v2\/posts\/680\/revisions\/716"}],"wp:attachment":[{"href":"https:\/\/www.ludovicfavre.ch\/blog\/wp-json\/wp\/v2\/media?parent=680"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.ludovicfavre.ch\/blog\/wp-json\/wp\/v2\/categories?post=680"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.ludovicfavre.ch\/blog\/wp-json\/wp\/v2\/tags?post=680"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}