Les détails sur ce paquet sont disponibles dans Section 8.5.3, « Contenu de Glibc. »
Le paquet Glibc contient la bibliothèque principale du C. Cette bibliothèque fournit toutes les routines basiques pour allouer de la mémoire, chercher des répertoires, ouvrir et fermer des fichiers, les lire et les écrire, gérer les chaînes, faire correspondre des modèles, faire des calculs et ainsi de suite.
Tout d'abord, créez un lien symbolique pour respecter le LSB. De plus, pour x86_64, créez un lien symbolique de compatibilité requis pour le bon fonctionnement du chargeur de bibliothèques dynamiques :
case $(uname -m) in i?86) ln -sfv ld-linux.so.2 $LFS/lib/ld-lsb.so.3 ;; x86_64) ln -sfv ../lib/ld-linux-x86-64.so.2 $LFS/lib64 ln -sfv ../lib/ld-linux-x86-64.so.2 $LFS/lib64/ld-lsb-x86-64.so.3 ;; esac
La commande ci-dessus est correcte. La commande ln a plusieurs versions syntaxiques, donc assurez-vous de vérifier info coreutils ln et n(1) avant de signaler ce que vous pensez être une erreur.
Certains programmes de Glibc utilisent le répertoire /var/db
qui ne respecte pas le FHS pour stocker
leurs données d'exécution. Appliquez le correctif suivant pour que
ces programmes stockent leurs données d'exécution aux emplacements
indiqués par le FHS :
patch -Np1 -i ../glibc-2.42-fhs-1.patch
La documentation de Glibc recommande de construire Glibc dans un répertoire de construction dédié :
mkdir -v build cd build
Assurez-vous que les utilitaires ldconfig et sln sont installés dans
/usr/sbin
:
echo "rootsbindir=/usr/sbin" > configparms
Ensuite, préparez la compilation de Glibc :
../configure \ --prefix=/usr \ --host=$LFS_TGT \ --build=$(../scripts/config.guess) \ --disable-nscd \ libc_cv_slibdir=/usr/lib \ --enable-kernel=5.4
Voici la signification des options de configuration :
--host=$LFS_TGT,
--build=$(../scripts/config.guess)
L'effet combiné de ces commutateurs est que le système de
construction de Glibc se configure pour se compiler de
manière croisée en utilisant l'éditeur de liens croisé et le
compilateur croisé dans $LFS/tools
.
--enable-kernel=5.4
Ceci indique à Glibc de compiler la bibliothèque en prenant en charge les noyaux 5.4 et les noyaux Linux ultérieurs. Les contournements pour des noyaux plus anciens ne sont pas activés.
libc_cv_slibdir=/usr/lib
Cette option s'assure que la bibliothèque est installée dans /usr/lib au lieu du répertoire /lib64 par défaut sur les machines 64 bits.
--disable-nscd
Ne pas construire le démon de cache de service de nom qui n'est plus utilisé.
Lors de cette étape, le message d'avertissement suivant peut apparaître :
configure: WARNING: *** These auxiliary programs are missing or *** incompatible versions: msgfmt *** some features will be disabled. *** Check the INSTALL file for required versions.
Le programme msgfmt, manquant ou incompatible, ne pose généralement pas de problème. Ce programme msgfmt fait partie du paquet Gettext que la distribution hôte devrait fournir.
Il a été rapporté que ce paquet pouvait ne pas fonctionner en
construisant avec un « make parallèle ». Si cela arrive,
relancez la commande make avec l'option -j1
.
Compilez le paquet :
make
Installez le paquet :
Si LFS
n'est pas correctement
configurée, et si malgré les recommandations vous construisez en
root
, la commande suivante
installera la Glibc nouvellement construite sur votre système
hôte, ce qui le rendra presque sûrement inutilisable. Alors
assurez-vous que l'environnement est correctement initialisé et
que vous n'êtes pas root
avant de
lancer la commande suivante.
make DESTDIR=$LFS install
Voici la signification de l'option de make install ::
DESTDIR=$LFS
La variable make DESTDIR
est
utilisée par presque tous les paquets pour définir
l'emplacement où le paquet sera installé. Si elle n'est pas
configurée, elle renvoie par défaut à la racine (/
). Ici, nous spécifions que le paquet doit
être installé dans $LFS
, qui
deviendra la racine après le Section 7.4,
« Entrer dans l'environnement chroot. »
Corrigez un chemin codé en dur vers le chargeur d'exécutable dans le script ldd :
sed '/RTLDLIST=/s@/usr@@g' -i $LFS/usr/bin/ldd
Maintenant que notre chaîne d'outils croisée est en place, il est important de s'assurer que la compilation et l'édition des liens fonctionnent correctement. On peut s'en assurer en effectuant quelques vérifications :
echo 'int main(){}' | $LFS_TGT-gcc -x c - -v -Wl,--verbose &> dummy.log readelf -l a.out | grep ': /lib'
Il ne devrait pas y avoir d'erreurs et la sortie de la dernière commande aura cette forme (en permettant au nom de l'éditeur des liens de différer en fonction de la plateforme) :
[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
Remarquez que ce chemin ne devrait pas contenir /mnt/lfs
(ou la valeur de la variable
LFS
si vous en utilisez une autre). Le
chemin est résolu lorsque le programme compilé est exécuté, et cela
ne devrait arriver qu'après être entré dans l'environnement chroot
lorsque le noyau considérera que $LFS
est le répertoire racine (/
).
Maintenant, assurez-vous que vous êtes prêt à utiliser les bons fichiers :
grep -E -o "$LFS/lib.*/S?crt[1in].*succeeded" dummy.log
La sortie de la dernière commande devrait être :
/mnt/lfs/lib/../lib/Scrt1.o succeeded
/mnt/lfs/lib/../lib/crti.o succeeded
/mnt/lfs/lib/../lib/crtn.o succeeded
Vérifiez que le compilateur recherche les bons fichiers d'en-têtes :
grep -B3 "^ $LFS/usr/include" dummy.log
Cette commande devrait renvoyer la sortie suivante :
#include <...> search starts here:
/mnt/lfs/tools/lib/gcc/x86_64-lfs-linux-gnu/15.2.0/include
/mnt/lfs/tools/lib/gcc/x86_64-lfs-linux-gnu/15.2.0/include-fixed
/mnt/lfs/usr/include
À nouveau, le répertoire nommé selon votre triplet cible peut être différent de celui ci-dessus, selon l'architecture de votre système.
Ensuite, vérifiez que le nouvel éditeur de liens est utilisé avec les bons chemins de recherche :
grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g'
Les références au chemins qui ont des composantes comme « -linux-gnu » devraient être ignorés, mais sinon la sortie de la dernière commande devrait être :
SEARCH_DIR("=/mnt/lfs/tools/x86_64-lfs-linux-gnu/lib64")
SEARCH_DIR("=/usr/local/lib64")
SEARCH_DIR("=/lib64")
SEARCH_DIR("=/usr/lib64")
SEARCH_DIR("=/mnt/lfs/tools/x86_64-lfs-linux-gnu/lib")
SEARCH_DIR("=/usr/local/lib")
SEARCH_DIR("=/lib")
SEARCH_DIR("=/usr/lib");
Un système 32 bits peut utiliser quelques autres répertoires,
mais dans tous les cas le point important ici est que tous les
chemins devraient commencer par un signe égal (=
), qui sera remplacé par le répertoire sysroot
que nous avons configuré pour l'éditeur des liens.
Ensuite assurez-vous que vous utilisez la bonne libc :
grep "/lib.*/libc.so.6 " dummy.log
La sortie de la dernière commande devrait être :
attempt to open /mnt/lfs/usr/lib/libc.so.6 succeeded
Assurez-vous que GCC utilise le bon éditeur dynamique :
grep found dummy.log
La sortie de la dernière commande devrait être (avec éventuellement des différences spécifiques à votre plateforme dans le nom de l'éditeur dynamique) :
found ld-linux-x86-64.so.2 at /mnt/lfs/usr/lib/ld-linux-x86-64.so.2
Si la sortie ne ressemble pas à celle montrée ci-dessus ou si elle n'est pas disponible du tout, cela signifie que quelque chose s'est vraiment mal passé. Enquêtez et répétez les étapes pour trouver où les problèmes se trouvent et corrigez-les. Tout problème doit être résolu avant de continuer le processus.
Une fois que tout fonctionne correctement, nettoyez les fichiers de test :
rm -v a.out dummy.log
La construction des paquets dans le prochain chapitre servira de test supplémentaire pour vérifier que l'ensemble d'outils a été construit correctement. Si la construction de certains paquets échoue, en particulier Binutils-pass2 ou GCC-pass2, c'est une indication que quelque chose s’est mal passé dans les installations précédentes de Binutils, GCC, ou Glibc.
Les détails sur ce paquet sont disponibles dans Section 8.5.3, « Contenu de Glibc. »