Réajuster l'ensemble des outils

Maintenant que les nouvelles bibliothèques C ont été installées, il est temps de réajuster cet ensemble. Nous allons le configurer de façon à ce qu'il lie n'importe quel nouveau programme compilé avec les nouvelles bibliothèques C. De façon simple, ceci est le contraire de ce que nous avions fait à l'étape de "verrouillage" au début de ce chapitre.

La première chose à faire est d'ajuster l'éditeur de liens. Pour ceci, nous retenons les répertoires des sources et de construction de la deuxième passe pour Binutils. Installez l'éditeur de liens ajusté à partir du répertoire binutils-build :

make -C ld INSTALL=/tools/bin/install install

Note : Si vous avez oublié le message d'avertissement précédent pour conserver les répertoires des sources et de construction de Binutils à partir de la seconde passe du chapitre 5 ou si vous les avez supprimé accidentellement ou si vous avez perdu accès à ceux-ci, ne vous inquiétez pas, tout n'est pas perdu. Simplement, ignorez la commande ci-dessus. Cela aura pour résultat que le prochain paquet, Binutils, sera lié avec les bibliothèques Glibc de /tools au lieu de /usr. Ce n'est pas idéal. Néanmoins, nos tests ont montré que les binaires Binutils devaient être identiques.

A partir de maintenant, tout programme compilé sera uniquement lié avec les bibliothèques contenues dans /usr/lib et /lib. INSTALL=/tools/bin/install est nécessaire parce que le Makefile créé durant la seconde passe contient toujours la référence à /usr/bin/install, que nous n'avons pas encore installé. Certaines distributions hôtes contiennent un lien symbolique ginstall qui a la préférence dans le Makefile et donc pourrait proposer un problème ici. La commande ci-dessus s'en occupe aussi.

Vous pouvez maintenant supprimer les répertoires des sources et de construction de Binutils.

La prochaine chose à faire est de modifier le fichier specs de GCC de façon à ce qu'il pointe vers le nouvel éditeur de liens. Comme précédemment, nous utilisons une commande sed pour accomplir ceci :

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

Encore une fois, un copier/coller de ce qui se trouve ci-dessus est recommandé. Et comme précédemment, ce serait une bonne idée de vérifier le fichier specs pour s'assurer que les changements souhaités ont réellement eu lieu.

Important : Si vous travaillez sur une plateforme où le nom de l'éditeur de liens dynamiques est autre que ld-linux.so.2, vous devez substituer ld-linux.so.2 par le nom de l'éditeur de liens dynamiques de votre plate-forme. Référez-vous à la section intitulée Notes techniques sur l'atelier d'outils dans Chapitre 5 si nécessaire.

Attention

Il est impératif à ce point de s'arrêter et de s'assurer que les fonctionnalités de base fonctionnent comme prévu. Nous allons effectuer une simple vérification :

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

Si tout a fonctionné correctement, la sortie de la dernière commande sera :

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

Si vous n'obtenez pas une sortie comme celle montrée ci-dessus, ou aucune sortie du tout, 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. Notez particulièrement que /lib apparaît maintenant comme le préfixe de notre éditeur de liens dynamiques. Bien sûr, si vous travaillez sur une plate-forme 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.

Une fois satisfait, nettoyez les fichiers de test :

rm dummy.c a.out