Subversion Repositories svn LFS-FR

Rev

Rev 1344 | Blame | Compare with Previous | Last modification | View Log | RSS feed

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE sect1 PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
 "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
 <!ENTITY % general-entities SYSTEM "../general.ent">
  %general-entities;
]>

<sect1 id="ch-system-readjusting">
  <?dbhtml filename="readjusting.html"?>

  <title>Ré-ajustement de la chaîne d'outils</title>

  <para>Maintenant que les bibliothèques C finales ont été
  installées, il est temps d'ajuster de nouveau la chaîne d'outils. L'ensemble
  d'outils sera ajusté de façon à ce qu'il lie tout programme nouvellement
  compilé avec ces nouvelles bibliothèques. C'est le même processus que celui
  utilisé dans la phase d'<quote>ajustement</quote> au début du
  <xref linkend="chapter-temporary-tools"/>, avec les ajustements inversés. Dans
  <xref linkend="chapter-temporary-tools"/>, l'ensemble était passé des répertoires
  <filename class="directory">/{,usr/}lib</filename> de l'hôte dans le nouveau
  répertoire <filename class="directory">/tools/lib</filename>. Maintenant,
  l'ensemble sera guidé du même répertoire <filename class="directory">/tools/lib</filename>
   vers les répertoires <filename class="directory">/{,usr/}lib</filename>.</para>

  <para>D'abord, sauvegardez l'éditeur de liens de
  <filename class="directory">/tools</filename>, et remplacez-le par l'éditeur de
  lien ajusté que nous avons fait au chapitre 5. Nous créerons aussi
  un lien vers son équivalent dans
  a <filename class="directory">/tools/$(gcc
  -dumpmachine)/bin</filename>&nbsp;:</para>

<screen><userinput>mv -v /tools/bin/{ld,ld-old}
mv -v /tools/$(gcc -dumpmachine)/bin/{ld,ld-old}
mv -v /tools/bin/{ld-new,ld}
ln -sv /tools/bin/ld /tools/$(gcc -dumpmachine)/bin/ld</userinput></screen>

  <para>Puis, modifiez le fichier des specs GCC afin qu'il pointe vers
  le nouvel éditeur de liens dynamiques. La suppression simple de tous les
  exemples de <quote>/tools</quote> devrait nous  laisser uniquement le bon
  chemin sur l'éditeur de liens dynamique. Ajustez aussi  le fichier de specs
  pour que GCC sache où trouver les en-têtes corrects et les fichiers de
  démarrage de Glibc. Une commande
  <command>sed</command> fait cela&nbsp;:</para>

<screen><userinput>gcc -dumpspecs | sed -e 's@/tools@@g' \
    -e '/\*startfile_prefix_spec:/{n;s@.*@/usr/lib/ @}' \
    -e '/\*cpp:/{n;s@$@ -isystem /usr/include@}' &gt; \
    `dirname $(gcc --print-libgcc-file-name)`/specs</userinput></screen>

  <para>C'est une bonne idée d'examiner visuellement le fichier de specs
  pour vérifier que le changement voulu a bien été effectué.</para>

  <para>Il est impératif à ce moment d'arrêter et de vous assurer que les
  fonctions basiques (compilation et édition des liens) de l'ensemble des
  outils ajusté fonctionnent comme attendu. Pour cela, réalisez une petite
  vérification&nbsp;:</para>

<screen os="a"><userinput>echo 'main(){}' &gt; dummy.c
cc dummy.c -v -Wl,--verbose &amp;&gt; dummy.log
readelf -l a.out | grep ': /lib'</userinput></screen>

  <para os="b">Si tout fonctionne correctement, il ne devrait pas y avoir d'erreurs et
  la sortie de la commande sera (avec des différences spécifiques aux plateformes
  dans le nom de l'éditeur de liens)&nbsp;:</para>

<screen os="c"><computeroutput>[Requesting program interpreter: /lib/ld-linux.so.2]</computeroutput></screen>

  <para>Remarquez que <filename class="directory">/lib</filename> est maintenant le
  préfixe de notre éditeur de liens.</para>

  <para os="d">Maintenant, assurez-vous que nous utilisons les
  bons fichiers de démarrage&nbsp;:</para>

<screen os="e"><userinput>grep -o '/usr/lib.*/crt[1in].*succeeded' dummy.log</userinput></screen>

  <para os="f">Si tout fonctionne correctement, il ne devrait pas y avoir d'erreurs
  et la sortie de la dernière commande sera&nbsp;:</para>

<screen><computeroutput>/usr/lib/crti.o succeeded
/usr/lib/crtn.o succeeded</computeroutput></screen>

  <para os="g">Vérifiez que le compilateur cherche les bons fichiers
  d'en-tête&nbsp;:</para>

<screen><userinput>grep -B1 '^ /usr/include' dummy.log</userinput></screen>

  <para os="h">Cette commande devrait réussir avec la sortie suivante&nbsp;:</para>

<screen><computeroutput>#include &lt;...&gt; search starts here:
 /usr/include</computeroutput></screen>

  <para os="i">Puis, vérifiez que le nouvel éditeur de liens est utilisé
  avec les bons chemins de recherche&nbsp;:</para>

<screen os="j"><userinput>grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g'</userinput></screen>

  <para os="k">Si tout fonctionne correctement, il ne devrait pas y avoir d'erreurs
  et la sortie de la dernière commande sera (selon la triplette cible
  spécifique à chaque plateforme)&nbsp;:</para>

<screen><computeroutput>SEARCH_DIR("/tools/i686-pc-linux-gnu/lib")
SEARCH_DIR("/usr/lib")
SEARCH_DIR("/lib");</computeroutput></screen>

  <para os="l">Ensuite, assurez-vous que nous utilisons la bonne libc&nbsp;:</para>

<screen os="m"><userinput>grep "/lib.*/libc.so.6 " dummy.log</userinput></screen>

  <para os="n">Si tout fonctionne correctement, il ne devrait pas y avoir d'erreur
    et la sortie de la dernière commande sera (selon la triplette cible
  spécifique à chaque plateforme)&nbsp;:</para>

<screen os="o"><computeroutput>attempt to open /lib/libc.so.6 succeeded</computeroutput></screen>

  <para os="p">Pour finir, assurez-vous que GCC utilise le bon éditeur de liens dynamiques&nbsp;:</para>

<screen os="q"><userinput>grep found dummy.log</userinput></screen>

  <para os="r">Si tout fonctionne correctement, il ne devrait pas y avoir d'erreurs et
  la sortie de la commande sera (avec des différences spécifiques aux plateformes
  dans le nom de l'éditeur de liens et un répertoire lib64 sur les hôtes
  64 bits)&nbsp;:</para>

<screen os="s"><computeroutput>found ld-linux.so.2 at /lib/ld-linux.so.2</computeroutput></screen>

  <para os="t">Si la sortie n'apparaît pas comme montré ci-dessus ou
  qu'elle n'apparaît pas du tout, alors quelque chose ne va vraiment pas.
  Enquêtez et retracez les étapes pour savoir d'où vient le problème et comment le
  corriger. La raison la plus probable est que quelque chose s'est mal passé lors
  de la modification du fichier specs ci-dessus. Tout problème devra être résolu
  avant de continuer le processus.</para>

  <para os="u">Une fois que tout fonctionne correctement, nettoyez les fichiers
  tests&nbsp;:</para>

<screen os="v"><userinput>rm -v dummy.c a.out dummy.log</userinput></screen>

</sect1>