5.12. GCC-4.3.2 - Pass 2

Le paquet GCC contient la collection de compilateurs GNU, qui inclut les compilateurs C et C++.

Temps de construction estimé : 6.5 SBU
Espace disque requis : 865 Mio

5.12.1. Ré-installation de GCC

Les outils requis pour tester GCC et Binutils (Tcl, Expect et DejaGnu) sont maintenant installés. GCC et Binutils peuvent maintenant être reconstruits en les liant avec la nouvelle Glibc et en les testant correctement (si vous souhaitez lancer les suites de tests dans ce chapitre). Merci de noter que ces suites de tests dépendent énormément de pseudos terminaux (PTY) fonctionnels fournis par votre distribution hôte. Les PTY sont le plus souvent implémentés via le système de fichiers devpts. Vérifiez si le système hôte est correctement configuré en réalisant un simple test :

expect -c "spawn ls"

Le résultat pourrait être :

The system has no more ptys.
Ask your system administrator to create more.

Si vous obtenez le message ci-dessus, la distribution hôte n'est pas correctement configurée pour les PTY. Dans ce cas, il ne sert à rien de lancer les suites de tests de GCC et Binutils jusqu'à la correction de ce problème. Merci de consulter la FAQ LFS sur http://www.linuxfromscratch.org//lfs/faq.html#no-ptys pour plus d'informations sur la façon de faire fonctionner les PTY.

Comme déjà expliqué à la section Section 5.8, « Ajuster l'ensemble d'outils », en temps normal le script GCC fixincludes est exécuté afin de réparer des fichiers d'en-tête potentiellement cassés. Comme GCC-4.3.2 et Glibc-2.8-20080929 ont désormais déjà été installés, et vu que leur fichiers d'en-têtes respectifs sont connus comme n'ayant pas besoin de réparation, le script fixincludes n'est pas utile. Comme mentionné précédemment, il se peut que le script pollue l'environnement de construction en installant des en-têtes corrigées du système hôte dans le répertoire autonome include de GCC. L'exécution du script fixincludes peut être supprimée en lançant les commandes suivantes :

cp -v gcc/Makefile.in{,.orig}
sed 's@\./fixinc\.sh@-c true@' gcc/Makefile.in.orig > gcc/Makefile.in

La construction bootstrap effectuée à la section Section 5.5, « GCC-4.3.2 - Passe 1 » a compilé GCC avec le commutateur du compilateur -fomit-frame-pointer. Les constructions Non-bootstrap omettent ce commutateur par défaut, donc appliquez le correctif sed suivant pour l'utiliser afin d'assurer des compilations cohérentes :

cp -v gcc/Makefile.in{,.tmp}
sed 's/^XCFLAGS =$/& -fomit-frame-pointer/' gcc/Makefile.in.tmp \
  > gcc/Makefile.in

La commande suivante modifiera l'emplacement par défaut de l'éditeur de lien dynamique de GCC pour utiliser celui que nous avons installé dans /tools. Il supprime aussi /usr/include du chemin de recherche des en-têtes de GCC.

Faire cela maintenant plutôt qu'ajuster le fichier specs après l'installation nous assure que l'éditeur de liens dynamiques sera utilisé 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. Lancez :

for file in $(find gcc/config -name linux64.h -o -name linux.h) 
do
   cp -uv $file{,.orig}
   sed -e 's@/lib\(64\)\?\(32\)\?/ld@/tools&@g' \
   -e 's@/usr@/tools@g' $file.orig > $file
   echo "
#undef STANDARD_INCLUDE_DIR
#define STANDARD_INCLUDE_DIR 0" >> $file
   touch $file.orig
done

Si ce qui précède vous semble dur à suivre, décomposons-le un peu. D'abord, nous trouvons tous les fichiers sous le répertoire gcc/config qui sont nommés soit linux.h soit linux64.h. Pour chaque fichier trouvé, nous le copions vers un fichier du même nom mais avec en plus le suffixe « .orig ». Puis la première expression sed préfixe chaque occurrence de « /lib/ld », « /lib64/ld » ou « /lib32/ld » par « /tools », tandis que la deuxième remplace les occurrences de « /usr » codées en dur. Nous ajoutons alors nos déclarations define qui modifient le chemin de recherche à la fin du fichier. Enfin, nous utilisons touch pour mettre à jour l'horodatage des fichiers copiés. Utilisé conjointement avec cp -u, cela empêche les modifications inattendues des fichiers d'origine au cas où la commande serait exécutée deux fois par inadvertence.

Comme dans la première construction de GCC, il a besoin de GMP et de MPFR. Déballez les archives tar et déplacez-les dans les répertoires nommàs comme il le faut :

tar -jxf ../mpfr-2.3.2.tar.bz2 
mv mpfr-2.3.2 mpfr
tar -jxf ../gmp-4.2.4.tar.bz2
mv gmp-4.2.4 gmp

De nouveau, créez un répertoire de construction séparé :

mkdir -v ../gcc-build
cd ../gcc-build

Avant de commencer la construction de GCC, rappelez-vous de désinitialiser toute variable d'environnement surchargeant les options d'optimisation par défaut.

Maintenant, préparez la compilation de GCC :

../gcc-4.3.2/configure --prefix=/tools \
    --with-local-prefix=/tools --enable-clocale=gnu \
    --enable-shared --enable-threads=posix \
    --enable-__cxa_atexit --enable-languages=c,c++ \
    --disable-libstdcxx-pch --disable-bootstrap

Voici la signification des nouvelles options de configure :

--enable-clocale=gnu

Cette option nous assure que le bon modèle de locale est sélectionné pour les bibliothèques C++ sous toutes les circonstances. Si le script configure trouve la locale de_DE installée, il sélectionnera le bon modèle de locale gnu. Néanmoins, si la locale de_DE n'est pas installée, il existe un risque de construire des bibliothèques C++ incompatibles avec ABI (Application Binary Interface) à cause du choix d'un mauvais modèle générique de locale.

--enable-threads=posix

Ceci active la gestion des exceptions C++ pour le code multi-threadé.

--enable-__cxa_atexit

Cette option autorise l'utilisation de __cxa_atexit, plutôt que atexit, pour enregistrer les destructeurs C++ des objets statiques locaux et globaux. Cette option est essentielle pour la gestion des destructeurs en compatibilité complète avec les standards. Il affecte aussi l'ABI C++ et donc résulte en des bibliothèques partagées et des programmes C++ interopérables avec les autres distributions Linux.

--enable-languages=c,c++

Cette option garantie que les compilateurs C et C++ seront construits.

--disable-libstdcxx-pch

Ce commutateur empêche la construction de l'en-tête précompilé (PCH) de libstdc++. Il prend beaucoup d'espace et nous n'en avons aucune utilité.

--disable-bootstrap

Le bootstrapping du compilateur est le comportement par défaut dans GCC. Cependant, notre méthode de compilation devrait nous fournir un compilateur solide sans besoin de bootstrap chaque fois.

Compilez le paquet :

make

La compilation est maintenant terminée. Comme mentionné plus tôt, lancer les suites de test pour les outils temporaires de ce chapitre n'est pas nécessaire. Néanmoins, pour exécuter la suite de tests de GCC, lancez la commande suivante :

make -k check

L'option -k est utilisée pour faire en sorte que toute la suite de tests est exécutée et qu'elle ne s'arrête pas au premier échec. La suite de tests GCC est très complète et il est pratiquement garanti que certaines erreurs apparaîtront.

Pour des précisions sur l'échec de tests qui revêtent une importance particulière, merci de lire Section 6.14, « GCC-4.3.2. »

Installez le paquet :

make install
[Attention]

Attention

Il est impératif à ce moment de s'arrêter et de s'assurer que les fonctions basiques (compilation et édition des liens) du nouvel ensemble d'outils fonctionnent comme attendu. Pour réaliser une vérification de propreté, lancez les commandes suivantes :

echo 'main(){}' > dummy.c
cc dummy.c
readelf -l a.out | grep ': /tools'

Si tout fonctionne correctement, il ne devrait pas y avoir d'erreurs et la sortie de la dernière commande sera de la forme :

[Requesting program interpreter:
    /tools/lib/ld-linux.so.2]

Notez que /tools/lib apparaît comme préfixe de l'éditeur de liens dynamique.

Si l'affichage diffère ou s'il n'y a aucun affichage, alors quelque chose ne se passe pas bien. Enquêtez et tracez vos étapes pour trouver où se cache le problème et comment le corriger. Ce problème doit être corrigé avant de continuer. Tout d'abord, relancez la vérification de propreté en utilisant gcc au lieu de cc. Si cela fonctionne, le lien symbolique /tools/bin/cc est manquant. Lisez de nouveau Section 5.5, « GCC-4.3.2 - Passe 1, » et installez le lien symbolique. Ensuite, assurez-vous que le PATH est correct. Ceci se vérifie en lançant echo $PATH et en vérifiant que /tools/bin est en tête de la liste. Si le PATH est mauvais, cela pourrait signifier que vous n'êtes pas connecté en tant qu'utilisateur lfs ou que quelque chose s'est mal passé dans Section 4.4, « Configurer l'environnement. ». Une autre possibilité est que quelque chose a pu mal se passer avec la correction du fichier specs ci-dessus. Dans ce cas, refaites la modification de ce fichier en vous assurant de copier/coller les commandes.

Une fois que tout va bien, nettoyez les fichiers de test ::

rm -v dummy.c a.out

Les détails sur ce paquet sont situés dans Section 6.14.2, « Contenu de GCC. »