Subversion Repositories svn LFS-FR

Rev

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

Rev Author Line No. Line
475 gleu 1
<?xml version="1.0" encoding="ISO-8859-1"?>
590 gleu 2
<!DOCTYPE sect1 PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
3
  "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
475 gleu 4
  <!ENTITY % general-entities SYSTEM "../general.ent">
5
  %general-entities;
6
]>
590 gleu 7
 
522 gleu 8
<sect1 id="ch-tools-gcc-pass2" role="wrap">
590 gleu 9
  <?dbhtml filename="gcc-pass2.html"?>
358 guillaume 10
 
602 texou 11
  <sect1info condition="script">
12
    <productname>gcc</productname>
13
    <productnumber>&gcc-version;</productnumber>
14
    <address>&gcc-url;</address>
15
  </sect1info>
16
 
995 jmengual 17
  <title>GCC-&gcc-version; - Passe 2</title>
358 guillaume 18
 
590 gleu 19
  <indexterm zone="ch-tools-gcc-pass2">
20
    <primary sortas="a-GCC">GCC</primary>
21
    <secondary>outils, passe 2</secondary>
22
  </indexterm>
358 guillaume 23
 
590 gleu 24
  <sect2 role="package">
25
    <title/>
522 gleu 26
 
1152 jmengual 27
    <xi:include xmlns:xi="http://www.w3.org/2001/XInclude"
590 gleu 28
    href="../chapter06/gcc.xml"
29
    xpointer="xpointer(/sect1/sect2[1]/para[1])"/>
522 gleu 30
 
590 gleu 31
    <segmentedlist>
32
      <segtitle>&buildtime;</segtitle>
33
      <segtitle>&diskspace;</segtitle>
522 gleu 34
 
590 gleu 35
      <seglistitem>
36
        <seg>&gcc-ch5p2-sbu;</seg>
37
        <seg>&gcc-ch5p2-du;</seg>
38
      </seglistitem>
39
    </segmentedlist>
439 guillaume 40
 
590 gleu 41
  </sect2>
439 guillaume 42
 
590 gleu 43
  <sect2 role="installation">
731 texou 44
    <title>Installation de GCC</title>
522 gleu 45
 
731 texou 46
    <para>Les versions de GCC supérieures à 4.3 vont gérer cette construction
995 jmengual 47
    comme si C était un compilateur placé à un nouvel endroit et interdire
731 texou 48
    la recherche de fichiers de démarrage (startfiles) dans l'emplacement
49
    spécifié par <parameter>--prefix</parameter>. Comme ce ne sera pas un
50
    compilateur placé à un nouvel endroit, et vu que les fichiers de
51
    démarrage dans <filename class="directory">/tools</filename> sont cruciaux
52
    pour la construction d'un compilateur fonctionnel liés aux libs dans
53
    <filename class="directory">/tools</filename>, appliquez le correctif suivant
54
    qui ramène partiellement GCC vers son  ancien comportement&nbsp;:</para>
55
 
56
<screen><userinput remap="pre">patch -Np1 -i ../&gcc-startfiles-patch;</userinput></screen>
590 gleu 57
 
731 texou 58
    <para>Dans des circonstances normales, le script
59
    <command>fixincludes</command> de GCC est exécuté
590 gleu 60
    afin de réparer des fichiers d'en-tête potentiellement cassés. Comme
61
    GCC-&gcc-version; et Glibc-&glibc-version; ont désormais déjà été installés,
62
    et vu que leur fichiers d'en-têtes respectifs sont connus comme n'ayant
63
    pas besoin de réparation, le script <command>fixincludes</command> n'est
843 texou 64
    pas utile. En fait, il se peut que le script pollue
590 gleu 65
    l'environnement de construction en installant des en-têtes corrigées du
66
    système hôte dans le répertoire autonome include de GCC. L'exécution du
67
    script <command>fixincludes</command> peut être supprimée en lançant les
68
    commandes suivantes&nbsp;:</para>
439 guillaume 69
 
602 texou 70
<screen><userinput remap="pre">cp -v gcc/Makefile.in{,.orig}
590 gleu 71
sed 's@\./fixinc\.sh@-c true@' gcc/Makefile.in.orig &gt; gcc/Makefile.in</userinput></screen>
439 guillaume 72
 
831 texou 73
    <para>Pour les machines x86, une construction bootstrap de GCC utilise le drapeau
74
    <option>-fomit-frame-pointer</option> du compilateur. Les constructions non-bootstrap suppriment ce drapeau par défaut, l'objectif
75
    serait d'obtenir un compilateur qui est exactement le même que si nous étions bootstrapés. Appliquez la commande
76
    <command>sed</command> suivante pour obliger la construction à utiliser le drapeau&nbsp;:</para>
439 guillaume 77
 
602 texou 78
<screen><userinput remap="pre">cp -v gcc/Makefile.in{,.tmp}
872 texou 79
sed 's/^T_CFLAGS =$/&amp; -fomit-frame-pointer/' gcc/Makefile.in.tmp \
590 gleu 80
  &gt; gcc/Makefile.in</userinput></screen>
439 guillaume 81
 
667 texou 82
    <para>La commande suivante modifiera l'emplacement par défaut de l'éditeur de lien
731 texou 83
    dynamique de GCC pour utiliser celui installé dans
602 texou 84
    <filename class="directory">/tools</filename>. Il supprime aussi
85
    <filename class="directory">/usr/include</filename> du chemin de
86
    recherche des en-têtes de GCC.</para>
555 gleu 87
 
602 texou 88
    <para>Faire cela maintenant plutôt qu'ajuster le fichier specs après
590 gleu 89
    l'installation nous assure que l'éditeur de liens dynamiques sera utilisé
667 texou 90
    lors de la construction de GCC. C'est-à-dire que tous les exécutables créés lors de la construction seront liés à la nouvelle Glibc.
602 texou 91
    Lancez&nbsp;:</para>
92
 
730 texou 93
<screen><userinput remap="pre">for file in \
94
 $(find gcc/config -name linux64.h -o -name linux.h -o -name sysv4.h)
602 texou 95
do
96
   cp -uv $file{,.orig}
97
   sed -e 's@/lib\(64\)\?\(32\)\?/ld@/tools&amp;@g' \
98
   -e 's@/usr@/tools@g' $file.orig &gt; $file
762 texou 99
   echo '
602 texou 100
#undef STANDARD_INCLUDE_DIR
731 texou 101
#define STANDARD_INCLUDE_DIR 0
102
#define STANDARD_STARTFILE_PREFIX_1 ""
103
#define STANDARD_STARTFILE_PREFIX_2 ""' &gt;&gt; $file
602 texou 104
   touch $file.orig
105
done</userinput></screen>
439 guillaume 106
 
602 texou 107
    <para>Si ce qui précède vous semble dur à suivre, décomposons-le un peu.
936 jmengual 108
    D'abord, nous trouvons tous les fichiers sous le répertoire <filename class="directory">gcc/config</filename> qui
730 texou 109
    sont nommés <filename>linux.h</filename> ou <filename>linux64.h</filename>.
110
    Pour chaque fichier trouvé, nous le copions
602 texou 111
    vers un fichier du même nom mais avec en plus le suffixe <quote>.orig</quote>.
667 texou 112
    Puis la première expression sed préfixe chaque
602 texou 113
    occurrence de <quote>/lib/ld</quote>, <quote>/lib64/ld</quote> ou
667 texou 114
    <quote>/lib32/ld</quote> par  <quote>/tools</quote>, tandis que la deuxième remplace les occurrences de <quote>/usr</quote> codées en dur. Nous ajoutons alors nos déclarations define qui
731 texou 115
    modifient le chemin de recherche et le préfixe du fichier de démarrage
116
    par défaut à la fin du fichier. Enfin, nous utilisons
667 texou 117
    <command>touch</command> pour mettre à jour l'horodatage des fichiers copiés.
602 texou 118
    Utilisé conjointement avec <command>cp -u</command>, cela empêche les
936 jmengual 119
    modifications inattendues des fichiers d'origine au cas où les commandes
120
    seraient exécutées deux fois par inadvertence.</para>
696 texou 121
 
731 texou 122
    <para>En x86_64, le déparamétrage du spec multilib (multibibliothèque) pour GCC
730 texou 123
    assure qu'il ne s'efforcera pas de se lier aux bibliothèque sur le
124
    système hôte&nbsp;:</para>
125
 
731 texou 126
<screen><userinput remap="pre">case $(uname -m) in
127
  x86_64)
128
    for file in $(find gcc/config -name t-linux64) ; do \
129
      cp -v $file{,.orig}
130
      sed '/MULTILIB_OSDIRNAMES/d' $file.orig &gt; $file
131
    done
132
  ;;
133
esac</userinput></screen>
134
 
1347 jmengual 135
    <para>Corrigez GCC pour ajouter <option>-D_FORTIFY_SOURCE=2</option>,
136
    <option>-fPIE</option> <option>-pie</option>, <option>-fstack-protector-all</option>,
137
    et <option>--param=ssp-buffer-size=4</option> par défaut&nbsp;:</para>
138
 
139
<screen><userinput remap="pre">patch -Np1 -i ../&gcc-fortify_source-patch;
140
patch -Np1 -i ../&gcc-fpie-patch;
141
patch -Np1 -i ../&gcc-fstack_protector-patch;</userinput></screen>
142
 
1149 jmengual 143
    <para>Comme dans la première construction de GCC, il a besoin de GMP,
144
    de MPFR et MPC. Déballez les archives tar et déplacez-les dans les répertoires
995 jmengual 145
    nommés comme il le faut&nbsp;:</para>
696 texou 146
 
147
<screen><userinput remap="pre">tar -jxf ../mpfr-&mpfr-version;.tar.bz2
835 texou 148
mv -v mpfr-&mpfr-version; mpfr
696 texou 149
tar -jxf ../gmp-&gmp-version;.tar.bz2
1149 jmengual 150
mv -v gmp-&gmp-version; gmp
151
tar -zxf ../mpc-&mpc-version;.tar.gz
152
mv -v mpc-&mpc-version; mpc</userinput></screen>
590 gleu 153
 
154
    <para>De nouveau, créez un répertoire de construction
155
    séparé&nbsp;:</para>
156
 
602 texou 157
<screen><userinput remap="pre">mkdir -v ../gcc-build
439 guillaume 158
cd ../gcc-build</userinput></screen>
159
 
590 gleu 160
    <para>Avant de commencer la construction de GCC, rappelez-vous de désinitialiser
161
    toute variable d'environnement surchargeant les options d'optimisation par
162
    défaut.</para>
439 guillaume 163
 
590 gleu 164
    <para>Maintenant, préparez la compilation de GCC&nbsp;:</para>
439 guillaume 165
 
731 texou 166
<screen><userinput remap="configure">CC="$LFS_TGT-gcc -B/tools/lib/" \
167
    AR=$LFS_TGT-ar RANLIB=$LFS_TGT-ranlib \
168
        ../gcc-&gcc-version;/configure --prefix=/tools \
590 gleu 169
    --with-local-prefix=/tools --enable-clocale=gnu \
170
    --enable-shared --enable-threads=posix \
171
    --enable-__cxa_atexit --enable-languages=c,c++ \
730 texou 172
    --disable-libstdcxx-pch --disable-multilib \
1217 jmengual 173
    --disable-bootstrap --disable-libgomp \
1193 jmengual 174
    --with-gmp-include=$(pwd)/gmp --with-gmp-lib=$(pwd)/gmp/.libs \
175
    --without-ppl --without-cloog</userinput></screen>
439 guillaume 176
 
590 gleu 177
    <variablelist>
178
      <title>Voici la signification des nouvelles options de configure&nbsp;:</title>
439 guillaume 179
 
590 gleu 180
      <varlistentry>
181
        <term><parameter>--enable-clocale=gnu</parameter></term>
182
        <listitem>
183
          <para>Cette option nous assure que le bon modèle de locale est
184
          sélectionné pour les bibliothèques C++ sous toutes les circonstances. Si le
185
          script configure trouve la locale <emphasis>de_DE</emphasis> installée, il
186
          sélectionnera le bon modèle de locale gnu. Néanmoins, si la locale
187
          <emphasis>de_DE</emphasis> n'est pas installée, il existe un risque de
188
          construire des bibliothèques C++ incompatibles avec ABI (Application
189
          Binary Interface) à cause du choix d'un
190
          mauvais modèle générique de locale.</para>
191
        </listitem>
192
      </varlistentry>
439 guillaume 193
 
590 gleu 194
      <varlistentry>
195
        <term><parameter>--enable-threads=posix</parameter></term>
196
        <listitem>
197
          <para>Ceci active la gestion des exceptions C++ pour le code
198
          multi-threadé.</para>
199
        </listitem>
200
      </varlistentry>
475 gleu 201
 
590 gleu 202
      <varlistentry>
203
        <term><parameter>--enable-__cxa_atexit</parameter></term>
204
        <listitem>
205
          <para>Cette option autorise l'utilisation de
206
          <function>__cxa_atexit</function>, plutôt que
207
          <function>atexit</function>, pour enregistrer les destructeurs C++ des objets statiques locaux et globaux.
208
          Cette option est essentielle pour la gestion des destructeurs en compatibilité
209
          complète avec les standards. Il affecte aussi l'ABI C++ et donc résulte en des
210
          bibliothèques partagées et des programmes C++ interopérables avec les autres
211
          distributions Linux.</para>
212
        </listitem>
213
      </varlistentry>
439 guillaume 214
 
590 gleu 215
      <varlistentry>
216
        <term><parameter>--enable-languages=c,c++</parameter></term>
217
        <listitem>
218
          <para>Cette option garantie que les compilateurs
219
          C et C++ seront construits.</para>
220
        </listitem>
221
      </varlistentry>
439 guillaume 222
 
590 gleu 223
      <varlistentry>
224
        <term><parameter>--disable-libstdcxx-pch</parameter></term>
225
        <listitem>
226
          <para>Ce commutateur empêche la construction de l'en-tête précompilé
227
          (PCH) de
228
          <filename class="libraryfile">libstdc++</filename>. Il prend beaucoup
229
          d'espace et nous n'en avons aucune utilité.</para>
230
        </listitem>
231
      </varlistentry>
522 gleu 232
 
602 texou 233
      <varlistentry>
234
        <term><parameter>--disable-bootstrap</parameter></term>
235
        <listitem>
831 texou 236
          <para>Pour les constructions natives de GCC, on a par défaut une compilation "bootstrap". Elle ne fait pas que compiler GCC, mais
237
          elle le compile plusieurs fois. Elle utilise les programmes compilés dans une première étape pour se compiler une seconde fois,
238
          puis une troisième fois à nouveau. Les deuxième et troisième passages sont comparés pour garantir qu'elle peut se reproduire
239
          facilement. Cela implique aussi qu'elle a été compilée correctement. Néanmoins, la méthode de compilation LFS devrait fournir un
240
          compilateur solide sans qu'il soit nécessaire de bootstraper chaque fois.</para>
602 texou 241
        </listitem>
242
      </varlistentry>
590 gleu 243
    </variablelist>
439 guillaume 244
 
590 gleu 245
    <para>Compilez le paquet&nbsp;:</para>
246
 
1217 jmengual 247
<screen><userinput remap="make">make</userinput></screen>
439 guillaume 248
 
731 texou 249
    <para>Installez le paquet&nbsp;:</para>
555 gleu 250
 
731 texou 251
<screen><userinput remap="install">make install</userinput></screen>
439 guillaume 252
 
731 texou 253
    <para>En touche finale, créez un lien symbolique. Beaucoup de programmes
254
    et de scripts lance <command>cc</command> au lieu de <command>gcc</command>,
255
    qui est utilisé pour conserver des programmes génériques, utilisables donc
256
    sur n'importe quel type de système où le compilateur C n'est pas toujours
257
    installé. L'exécution de <command>cc</command> laisse l'administrateur du
258
    système décider quel  compilateur C installer&nbsp;:</para>
259
 
260
<screen><userinput remap="install">ln -vs gcc /tools/bin/cc</userinput></screen>
439 guillaume 261
 
731 texou 262
    <caution>
263
 
264
      <para>A ce stade, il est impératif de s'arrêter et de s'assurer que
265
      les fonctions de base (compilation et édition de liens) du nouvel ensemble
266
      d'outils fonctionnent comme prévu. Pour effectuer un test de propreté,
267
      lancez les commandes suivantes&nbsp;:</para>
268
 
269
<screen><userinput>echo 'main(){}' &gt; dummy.c
270
cc dummy.c
271
readelf -l a.out | grep ': /tools'</userinput></screen>
272
 
273
      <para>Si tout fonctionne correctement, il ne devrait pas y avoir
274
      d'erreurs et la sortie de la dernière commande aura la forme&nbsp;:</para>
885 texou 275
 
276
<screen><computeroutput>[Requesting program interpreter: /tools/lib/ld-linux.so.2]</computeroutput></screen>
277
 
1080 jmengual 278
    <para>Remarquez que <filename class="directory">/tools/lib</filename> ou
731 texou 279
    <filename class="directory">/tools/lib64</filename> pour les machines
280
    64 bits apparaît comme préfixe de l'éditeur de liens dynamique.</para>
439 guillaume 281
 
731 texou 282
    <para>Si l'affichage diffère ou s'il n'y a aucun affichage, alors
283
    quelque chose ne se passe pas bien. Enquêtez et tracez vos étapes pour
284
    trouver où se cache le problème et comment le corriger. Ce problème doit
285
    être corrigé avant de continuer. Tout d'abord, relancez la vérification
286
    de propreté en utilisant
287
    <command>gcc</command> au lieu de <command>cc</command>. Si cela fonctionne,
288
    le lien symbolique <filename class="symlink">/tools/bin/cc</filename> est
289
    manquant. Installez le lien symbolique comme indiqué ci-dessus.
290
    Ensuite, assurez-vous que le <envar>PATH</envar> est correct. Ceci se
291
    vérifie en lançant <command>echo $PATH</command> et en vérifiant que
292
    <filename class="directory">/tools/bin</filename> est en tête de la
293
    liste. Si le <envar>PATH</envar> est mauvais, cela pourrait signifier
294
    que vous n'êtes pas connecté en tant qu'utilisateur
295
    <systemitem class="username">lfs</systemitem> ou que quelque chose s'est mal passé dans
296
    <xref linkend="ch-tools-settingenviron" role="."/>.</para>
475 gleu 297
 
731 texou 298
    <para>Une fois que tout va bien, nettoyez les fichiers de test&nbsp;::</para>
439 guillaume 299
 
731 texou 300
<screen><userinput>rm -v dummy.c a.out</userinput></screen>
301
 
302
  </caution>
303
 
590 gleu 304
  </sect2>
439 guillaume 305
 
590 gleu 306
  <sect2 role="content">
307
    <title/>
439 guillaume 308
 
590 gleu 309
    <para>Les détails sur ce paquet sont situés dans
310
    <xref linkend="contents-gcc" role="."/></para>
439 guillaume 311
 
590 gleu 312
  </sect2>
475 gleu 313
 
358 guillaume 314
</sect1>