8.5. Glibc-2.40

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.

Temps de construction approximatif: 12 SBU
Espace disque requis: 3,1 Go

8.5.1. Installation de Glibc

Certains programmes de Glibc utilisent le répertoire non conforme au FHS /var/db pour stocker leurs données d'exécution. Appliquez le correctif suivant pour que ces programmes stockent leurs données à des emplacements conformes au FHS :

patch -Np1 -i ../glibc-2.40-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 s’installent dans le répertoire /usr/sbin :

echo "rootsbindir=/usr/sbin" > configparms

Préparez la compilation de Glibc :

../configure --prefix=/usr                            \
             --disable-werror                         \
             --enable-kernel=4.19                     \
             --enable-stack-protector=strong          \
             --disable-nscd                           \
             libc_cv_slibdir=/usr/lib

Voici la signification des options de configuration :

--disable-werror

Désactive l'option -Werror passée à GCC. Ceci est nécessaire pour lancer la suite de tests.

--enable-kernel=4.19

Indique au système de construction que cette Glibc peut être utilisée avec les noyaux aussi vieux que 4.19 (maximum). Cela permet de générer des contournements au cas où on ne peut pas utiliser un appel système introduit dans une version ultérieure.

--enable-stack-protector=strong

Cette option améliore la sécurité du système en ajoutant du code supplémentaire pour vérifier les dépassements de tampon, comme dans les attaques par dépassement de pile. Remarquez que Glibc remplace toujours la valeur par défaut de GCC, donc cette option est nécessaire, même si nous avons déjà spécifié l'option --enable-default-ssp pour GCC.

--disable-nscd

Ne pas construire le démon de cache de service de nom qui n'est plus utilisé.

libc_cv_slibdir=/usr/lib

Indique la bibliothèque adaptée pour chaque système. Nous ne voulons pas utiliser lib64.

Compilez le paquet :

make
[Important]

Important

Dans cette section, la suite de tests de Glibc est considérée comme critique. Ne l’ignorez sous aucun prétexte.

En général, quelques tests ne réussissent pas, mais vous pouvez le plus souvent ignorer les erreurs listées ci-dessous.


make check

Vous verrez probablement quelques erreurs lors des tests. La suite de tests de Glibc est quelque peu dépendante du système hôte. Vous pouvez généralement ignorer quelques erreurs parmi les plus de 5 000 tests. Voici une liste des problèmes les plus fréquents dans les versions récentes de LFS :

  • io/tst-lchmod est connu pour échouer dans l'environnement chroot de LFS.

  • Certains tests, par exemple nss/tst-nss-files-hosts-multi et nptl/tst-thread-affinity* sont connus pour échouer à cause d'un délai d'attente dépassé (surtout quand le système est assez lent ou exécute la suite de tests avec plusieurs tâches make en parallèle). Ces tests peuvent être identifiés avec :

    grep "Timed out" $(find -name \*.out)

    Il est possible de relancer un test unique avec un plus grand délai d'attente avec TIMEOUTFACTOR=<factor> make test t=<nom du test>. Par exemple, TIMEOUTFACTOR=10 make test t=nss/tst-nss-files-hosts-multi relancera nss/tst-nss-files-hosts-multi avec dix fois plus de temps que l'original.

  • De plus, certains tests peuvent échouer avec un modèle de CPU assez ancien (par exemple elf/tst-cpu-features-cpuinfo) ou une version du noyau hôte assez ancienne (par exemple stdlib/tst-arc4random-thread).

Bien que ce ne soit qu'un simple message, l'étape d'installation de Glibc indiquera l'absence de /etc/ld.so.conf. Supprimez ce message d'avertissement avec :

touch /etc/ld.so.conf

Corrigez le Makefile généré pour éviter un test de cohérence obsolète qui échoue avec une configuration moderne de Glibc :

sed '/test-installation/s@$(PERL)@echo not running@' -i ../Makefile
[Important]

Important

Si vous mettez à jour Glibc vers une nouvelle version mineure (par exemple, de Glibc-2.36 à Glibc-2.40) sur un système LFS qui tourne, vous devez prendre des précautions supplémentaires pour éviter de casser votre système :

  • Mettre à jour Glibc sur un système LFS avant 11.0 (exclusif) n'est pas pris en charge. Reconstruisez LFS si vous avez un système LFS aussi vieux et que vous avez besoin d'une nouvelle Glibc.

  • Si vous mettez à jour depuis un système LFS avant 12.0 (exclusif), installez Libxcrypt en suivant Section 8.27, « Libxcrypt-4.4.36. ». En plus d'une installation de Libxcrypt normale, vous DEVEZ suivre la note dans la section Libxcrypt pour installer libcrypt.so.1* (ce qui remplace libcrypt.so.1 de l'installation de Glibc précédente).

  • Si vous mettez à jour depuis un système LFS avant 12.1 (exclusif), supprimez le programme nscd :

    rm -f /usr/sbin/nscd
  • Mettez à jour le noyau et redémarrez s'il est plus vieux que 4.19 (vérifiez la version actuelle avec uname -r) ou si vous voulez quand même le mettre à jour, en suivant Section 10.3, « Linux-6.10.5. »

  • Mettez à jour les en-têtes de l'API du noyau s'il est plus vieux que 4.19 (vérifiez la version actuelle avec cat /usr/include/linux/version.h) ou si vous voulez mettre à jour quand même, en suivant Section 5.4, « Linux-6.10.5 API Headers » (mais en supprimant $LFS de la commande cp).

  • Effectuez une installation DESTDIR et mettez à jour les bibliothèques Glibc partagées sur le système avec une seule commande install :

    make DESTDIR=$PWD/dest install
    install -vm755 dest/usr/lib/*.so.* /usr/lib

Il est impératif de suivre à la lettre ces étapes à moins de comprendre complètement ce que vous faites. Toute déviation inattendue peut rendre le système complètement instable. VOUS ÊTES PRÉVENU.

Continuez ensuite à exécutez la commande make install, la commande sed pour /usr/bin/ldd et les commandes pour installer les paramètres linguistiques. Une fois qu'elles ont fini, redémarrez le système immédiatement.

Installez le paquet :

make install

Corrigez le chemin codé en dur vers le chargeur d'exécutable dans le script ldd :

sed '/RTLDLIST=/s@/usr@@g' -i /usr/bin/ldd

Ensuite, installez les locales qui permettent à votre système de répondre dans une langue différente. Aucune n'est indispensable, mais si certaines sont absentes, les suites de test des futurs paquets peuvent sauter des tests importants.

Vous pouvez installer les locales individuelles en utilisant le programme localedef. Par exemple, la seconde commande localedef ci-dessous combine la définition de la locale indépendante du codage /usr/share/i18n/locales/cs_CZ avec la définition de la page de codes /usr/share/i18n/charmaps/UTF-8.gz et ajoute le résultat à la fin du fichier /usr/lib/locale/locale-archive. Les instructions suivantes installent les paramètres minimums des locales nécessaires au déroulement optimal des tests :

localedef -i C -f UTF-8 C.UTF-8
localedef -i cs_CZ -f UTF-8 cs_CZ.UTF-8
localedef -i de_DE -f ISO-8859-1 de_DE
localedef -i de_DE@euro -f ISO-8859-15 de_DE@euro
localedef -i de_DE -f UTF-8 de_DE.UTF-8
localedef -i el_GR -f ISO-8859-7 el_GR
localedef -i en_GB -f ISO-8859-1 en_GB
localedef -i en_GB -f UTF-8 en_GB.UTF-8
localedef -i en_HK -f ISO-8859-1 en_HK
localedef -i en_PH -f ISO-8859-1 en_PH
localedef -i en_US -f ISO-8859-1 en_US
localedef -i en_US -f UTF-8 en_US.UTF-8
localedef -i es_ES -f ISO-8859-15 es_ES@euro
localedef -i es_MX -f ISO-8859-1 es_MX
localedef -i fa_IR -f UTF-8 fa_IR
localedef -i fr_FR -f ISO-8859-1 fr_FR
localedef -i fr_FR@euro -f ISO-8859-15 fr_FR@euro
localedef -i fr_FR -f UTF-8 fr_FR.UTF-8
localedef -i is_IS -f ISO-8859-1 is_IS
localedef -i is_IS -f UTF-8 is_IS.UTF-8
localedef -i it_IT -f ISO-8859-1 it_IT
localedef -i it_IT -f ISO-8859-15 it_IT@euro
localedef -i it_IT -f UTF-8 it_IT.UTF-8
localedef -i ja_JP -f EUC-JP ja_JP
localedef -i ja_JP -f SHIFT_JIS ja_JP.SJIS 2> /dev/null || true
localedef -i ja_JP -f UTF-8 ja_JP.UTF-8
localedef -i nl_NL@euro -f ISO-8859-15 nl_NL@euro
localedef -i ru_RU -f KOI8-R ru_RU.KOI8-R
localedef -i ru_RU -f UTF-8 ru_RU.UTF-8
localedef -i se_NO -f UTF-8 se_NO.UTF-8
localedef -i ta_IN -f UTF-8 ta_IN.UTF-8
localedef -i tr_TR -f UTF-8 tr_TR.UTF-8
localedef -i zh_CN -f GB18030 zh_CN.GB18030
localedef -i zh_HK -f BIG5-HKSCS zh_HK.BIG5-HKSCS
localedef -i zh_TW -f UTF-8 zh_TW.UTF-8

En outre, installez la locale de votre pays, de votre langue et de votre encodage de caractères.

Sinon, vous pouvez installer les locales listées dans le fichier glibc-2.40/localedata/SUPPORTED (il inclut toutes les locales citées ci-dessus et bien plus) en une seule fois avec la commande suivante (qui prend un certain temps) :

make localedata/install-locales

Ensuite, utilisez la commande localedef pour créer et installer les locales non listées dans le fichier glibc-2.40/localedata/SUPPORTED dans le cas peu probable où vous en auriez besoin. Par exemple, les deux paramètres linguistiques suivants sont requis par certains tests plus tard dans ce chapitre :

localedef -i C -f UTF-8 C.UTF-8
localedef -i ja_JP -f SHIFT_JIS ja_JP.SJIS 2> /dev/null || true
[Note]

Note

Glibc utilise maintenant libidn2 lors de la résolution de noms de domaines internationalisés. C'est une dépendance à l'exécution. Si cette fonctionnalité est requise, les instructions pour installer libidn2 se trouvent sur la page libidn2 de BLFS.

8.5.2. Configuration de Glibc

8.5.2.1. Ajout de nsswitch.conf

Le fichier /etc/nsswitch.conf doit être créé car les valeurs par défaut de Glibc ne fonctionnent pas correctement dans un environnement en réseau.

Créez un nouveau fichier /etc/nsswitch.conf en exécutant :

cat > /etc/nsswitch.conf << "EOF"
# Begin /etc/nsswitch.conf

passwd: files
group: files
shadow: files

hosts: files dns
networks: files

protocols: files
services: files
ethers: files
rpc: files

# End /etc/nsswitch.conf
EOF

8.5.2.2. Ajout des données de fuseaux horaires

Installez et configurez les données de fuseaux horaires en exécutant :

tar -xf ../../tzdata2024a.tar.gz

ZONEINFO=/usr/share/zoneinfo
mkdir -pv $ZONEINFO/{posix,right}

for tz in etcetera southamerica northamerica europe africa antarctica  \
          asia australasia backward; do
    zic -L /dev/null   -d $ZONEINFO       ${tz}
    zic -L /dev/null   -d $ZONEINFO/posix ${tz}
    zic -L leapseconds -d $ZONEINFO/right ${tz}
done

cp -v zone.tab zone1970.tab iso3166.tab $ZONEINFO
zic -d $ZONEINFO -p America/New_York
unset ZONEINFO

Voici la signification de la commande zic :

zic -L /dev/null ...

Crée des fuseaux horaires posix sans secondes intercalaires. Par convention, on le met dans zoneinfo et dans zoneinfo/posix. Il faut indiquer les fuseaux horaires POSIX dans zoneinfo, sinon plusieurs suites de tests renverront des erreurs. Sur un système embarqué, où il y a peu de place et vous ne souhaitez pas mettre à jour les fuseaux horaires, vous pouvez économiser 1,9 Mo en n'utilisant pas le répertoire posix, mais certaines applications ou suites de tests pourraient échouer.

zic -L leapseconds ...

Crée les fuseaux horaires adaptés incluant les secondes intercalaires. Sur un système embarqué, où il y a peu de place et vous ne souhaitez pas mettre à jour les fuseaux horaires, ou si vous ne trouvez pas important d’avoir la bonne heure, vous pouvez économiser 1,9 Mo en ne mettant pas de répertoire right.

zic ... -p ...

Crée le fichier posixrules. Nous utilisons New York car POSIX exige que les règles de l’heure d’été respectent les règles américaines.

Lancez ce script pour déterminer dans quel fuseau horaire vous vous situez  :

tzselect

Après quelques questions sur votre emplacement, le script affichera le nom du fuseau horaire (par exemple Europe/Paris). D'autres fuseaux horaires sont aussi listés dans le fichier /usr/share/zoneinfo comme Canada/Eastern ou EST5EDT qui ne sont pas identifiés par le script mais qui peuvent être utilisés.

Puis créez le fichier /etc/localtime en exécutant :

ln -sfv /usr/share/zoneinfo/<xxx> /etc/localtime

Remplacez <xxx> par le nom du fuseau horaire sélectionné (par exemple Europe/Paris).

8.5.2.3. Configuration du chargeur dynamique

Par défaut, le chargeur dynamique (/lib/ld-linux.so.2) cherche dans /usr/lib les bibliothèques partagées nécessaires aux programmes lors de leur exécution. Néanmoins, s'il existe des bibliothèques dans d'autres répertoires que /usr/lib, leur emplacement doit être ajouté dans le fichier /etc/ld.so.conf pour que le chargeur dynamique les trouve. /usr/local/lib et /opt/lib sont deux répertoires qui contiennent des bibliothèques supplémentaires, donc ajoutez-les au chemin de recherche du chargeur dynamique.

Créez un nouveau fichier /etc/ld.so.conf en exécutant ce qui suit :

cat > /etc/ld.so.conf << "EOF"
# Begin /etc/ld.so.conf
/usr/local/lib
/opt/lib

EOF

Si vous le désirez, le chargeur dynamique peut également chercher un répertoire et inclure le contenu des fichiers qui s'y trouvent. Les fichiers de ce répertoire include sont en général constitués d'une ligne spécifiant le chemin vers la bibliothèque désirée. Pour ajouter cette possibilité, exécutez les commandes suivantes :

cat >> /etc/ld.so.conf << "EOF"
# Add an include directory
include /etc/ld.so.conf.d/*.conf

EOF
mkdir -pv /etc/ld.so.conf.d

8.5.3. Contenu de Glibc

Programmes installés: gencat, getconf, getent, iconv, iconvconfig, ldconfig, ldd, lddlibc4, ld.so (lien symbolique vers ld-linux-x86-64.so.2 ou ld-linux.so.2), locale, localedef, makedb, mtrace, pcprofiledump, pldd, sln, sotruss, sprof, tzselect, xtrace, zdump et zic
Bibliothèques installées: ld-linux-x86-64.so.2, ld-linux.so.2, libBrokenLocale.{a,so}, libanl.{a,so}, libc.{a,so}, libc_nonshared.a, libc_malloc_debug.so, libdl.{a,so.2}, libg.a, libm.{a,so}, libmcheck.a, libmemusage.so, libmvec.{a,so}, libnsl.so.1, libnss_compat.so, libnss_dns.so, libnss_files.so, libnss_hesiod.so, libpcprofile.so, libpthread.{a,so.0}, libresolv.{a,so}, librt.{a,so.1}, libthread_db.so et libutil.{a,so.1}
Répertoires installés: /usr/include/arpa, /usr/include/bits, /usr/include/gnu, /usr/include/net, /usr/include/netash, /usr/include/netatalk, /usr/include/netax25, /usr/include/neteconet, /usr/include/netinet, /usr/include/netipx, /usr/include/netiucv, /usr/include/netpacket, /usr/include/netrom, /usr/include/netrose, /usr/include/nfs, /usr/include/protocols, /usr/include/rpc, /usr/include/sys, /usr/lib/audit, /usr/lib/gconv, /usr/lib/locale, /usr/libexec/getconf, /usr/share/i18n, /usr/share/zoneinfo et /var/lib/nss_db

Descriptions courtes

gencat

Génère des catalogues de messages

getconf

Affiche les valeurs de configuration du système pour les variables spécifiques du système de fichiers

getent

Récupère les entrées à partir d'une base de données administrative

iconv

Convertit l’encodage de caractères

iconvconfig

Crée des fichiers de configuration pour le module iconv

ldconfig

Configure les liens d’exécution de l’éditeur de liens dynamiques

ldd

Indique les bibliothèques partagées requises pour chaque programme ou bibliothèque partagée

lddlibc4

Assiste ldd avec des fichiers objets. Elle n'existe pas sur les architectures plus récentes comme x86_64

locale

Affiche diverses informations sur la locale actuelle

localedef

Compile les spécifications de la locale

makedb

Crée une base de données simple à partir d'une entrée textuelle

mtrace

Lit et interprète un fichier de trace et en affiche un résumé dans un format lisible par un humain

pcprofiledump

Affiche des informations générées par un profilage du PC

pldd

Liste les objets dynamiques partagés utilisés en exécutant des processus

sln

Un programme ln lié statiquement

sotruss

Retrace les procédures d'appel d'une bibliothèque partagée pour la commande spécifiée

sprof

Lit et affiche les données de profilage des objets partagés

tzselect

Demande à l'utilisateur l'emplacement géographique du système et donne la description du fuseau horaire correspondant

xtrace

Retrace l'exécution d'un programme en affichant la fonction en cours d'exécution

zdump

Afficheur de fuseau horaire

zic

Compilateur de fuseau horaire

ld-*.so

Programme d'aide des bibliothèques partagées exécutables

libBrokenLocale

Utilisé en interne par Glibc comme une arme grossière pour résoudre les programmes cassés (comme certaines applications Motif). Voir les commentaires dans glibc-2.40/locale/broken_cur_max.c pour plus d'informations

libanl

Bibliothèque factice ne contenant aucune fonction. Il s’agissait d’une bibliothèque de recherche de noms asynchrone dont les fonctions se trouvent maintenant dans libc

libc

Bibliothèque du C principale

libc_malloc_debug

Active le test d'allocation de mémoire lorsqu'elle est préchargée

libdl

Bibliothèque factice ne contenant aucune fonction. Il s’agissait d’une bibliothèque d'interface de liaison dynamique dont les fonctions se trouvent maintenant dans libc

libg

Bibliothèque factice ne contenant aucune fonction. Il s’agissait d’une bibliothèque d'exécution pour g++

libm

Bibliothèque mathématique

libmvec

Bibliothèque de mathématiques vectorielles, liée si besoin quand libm est utilisée

libmcheck

Active le test d'allocation de mémoire lorsqu'on y relie quelque chose

libmemusage

Utilisé par memusage pour aider à la récupération d'informations sur l'utilisation de la mémoire par un programme

libnsl

Bibliothèque de services réseau, maintenant obsolète

libnss_*

Les modules du Name Service Switch, qui contient des fonctions de résolution de noms d'hôtes, de noms d'utilisateurs, de noms de groupes, d'alias, de services, de protocoles et ainsi de suite. Chargée par la libc en fonction de la configuration présente dans le fichier /etc/nsswitch.conf

libpcprofile

Peut être préchargé pour profiler le PC d'un exécutable

libpthread

Bibliothèque factice ne contenant aucune fonction. Elle contenait les fonctions fournissant la plupart des interfaces spécifiées par les extensions POSIX.1c pour les fils d'exécution et des interfaces à sémaphores spécifiées par POSIX.1b pour le temps réel. Ces fonctions se trouvent maintenant dans libc

libresolv

Contient des fonctions de création, d'envoi et d'interprétation de paquets pour les serveurs de noms de domaine Internet

librt

Contient des fonctions fournissant la plupart des interfaces spécifiées par l'extension POSIX.1b pour le temps réel

libthread_db

Contient des fonctions utiles pour construire des débogueurs de programmes multi-threads

libutil

Bibliothèque factice ne contenant aucune fonction. Elle contenait du code pour les fonctions « standard » utilisées dans de nombreux utilitaires Unix différents. Ces fonctions se trouvent maintenant dans libc