"Verrouiller" Glibc

Maintenant que les bibliothèques C temporaires ont été installées, nous voulons que les outils compilés avec le reste de ce chapitre soient liés avec ces bibliothèques. Pour accomplir ceci, nous avons besoin d'ajuster l'éditeur de liens et le fichier specs du compilateur.

Tout d'abord, installez les scripts améliorés de l'éditeur de liens en lançant ce qui suit à l'intérieur du répertoire binutils-build :

make -C ld install

Ces scripts ont été améliorés un peu avant, à la fin de la première passe de Binutils et ne contiennent aucune mention de /lib, /usr/lib ou /usr/local/lib. A partir de ça, tout va être lier seulement avec les bibliothèques dans /tools/lib.

L'éditeur de liens a été ajusté un peu auparavant, à la fin de la première passe de Binutils. A partir de maintenant, tout sera lié uniquement avec les bibliothèques contenues dans /tools/lib.

Maintenant que l'éditeur de liens ajusté est installé, vous pouvez supprimer les répertoires des sources et de construction de Binutils.

L'autre chose à faire est de modifier le fichier specs de GCC de façon à ce qu'il pointe vers le nouvel éditeur de liens dynamiques. Une simple commande sed accomplira ceci :

SPECFILE=/tools/lib/gcc-lib/*/*/specs
sed -e 's@/lib/ld.so.1@/tools/lib/ld.so.1@g' \
    -e 's@/lib/ld-linux.so.2@/tools/lib/ld-linux.so.2@g' \
    $SPECFILE > tempspecfile
mv tempspecfile $SPECFILE
unset SPECFILE

Nous recommandons de copier/coller les commandes ci-dessus plutôt que d'essayer de taper tout ce qui s'y trouve. Ou vous pouvez éditer le fichier specs à la main si vous le voulez : remplacez "/lib/ld-linux.so.2" par "/tools/lib/ld-linux.so.2" et "/lib/ld.so.1" avec "/tools/lib/ld.so.1".

En dernier lieu, il existe une possibilité que certains fichiers include de l'hôte système se trouvent dans le répertoire include privé de GCC. Ceci peut se produire parce que la procédure fixincludes de GCC est lancée en tant que partie la construction GCC. Nous expliquerons un peu mieux ceci dans ce chapitre. Pour l'instant, lancez les commandes suivantes pour éliminer cette possibilité.

rm -f /tools/lib/gcc-lib/*/*/include/{pthread.h,bits/sigthread.h}

Attention

Il est impératif à ce moment de s'arrêter pour s'assurer que les fonctions de base (compilation et édition de liens) du nouvel ensemble des outils fonctionneront comme on s'y attend. Pour cela, nous allons effectuer une vérification simple :

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

Si tout fonctionne correctement, la sortie de la dernière commande devrait être :

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

Si vous n'obtenez pas une sortie comme celle montrée ci-dessus, alors quelque chose va très mal. Vous devrez enquêter là-dessus et reprendre chaque étape pour trouver où est situé le problème et le corriger. Il ne sert à rien de continuer jusqu'à ce que ce soit corrigé. Il est probable que quelque chose s'est mal passé avec le fichier specs ci-dessus. Vérifiez particulièrement que /tools/lib apparaît comme le préfixe de notre éditeur de liens dynamiques. Bien sûr, si vous travaillez sur une plateforme où le nom de l'éditeur de liens est quelque chose d'autre que ld-linux.so.2, alors la sortie sera un peu différente.

Lorsque vous êtes sûr que tout va bien, effacez les fichiers de test :

rm dummy.c a.out

Ceci complète l'installation de l'ensemble d'outils qui pourra maintenant être utilisée pour construire le reste des outils temporaires.