10.8. Glibc-2.25 64-Bit

Le paquet Glibc contient la bibliothèque C principale. Cette bibliothèque fournit toutes les routines basiques pour allouer de la mémoire, rechercher des répertoires, ouvrir et fermer des fichiers, les lire et les écrire, gérer les chaînes, faire correspondre des modèles, faire de l'arithmétique et ainsi de suite.

10.8.1. Installation de Glibc

À la fin de l'installation, le système de construction lancera un test de cohérence pour s'assurer que tout est installé correctement. Ce script lance ses tests en tentant de compiler des programmes de test avec certaines bibliothèques. Cependant il ne spécifie pas le chemin vers ld.so et notre chaîne d'outils est toujours configurée pour utiliser celui de /tools. L'ensemble de commandes suivantes forcera le script à utiliser le chemin complet du nouveau ld.so qui vient d'être installé :

LINKER=$(readelf -l /tools/bin/bash | sed -n 's@.*interpret.*/tools\(.*\)]$@\1@p')
sed -i "s|libs -o|libs -L/usr/lib64 -Wl,-dynamic-linker=${LINKER} -o|" \
  scripts/test-installation.pl
unset LINKER

Le système de construction de Glibc est auto-extractible et il s'installera parfaitement, même si le fichier specs du compilateur et l'éditeur de liens pointent vers /tools. Les specs et l'éditeur de liens ne peuvent pas être ajustés avant l'installation de Glibc, car les tests autoconf de Glibc donneraient de faux résultats, ce qui irait à l'encontre du but de faire une construction propre.

La documentation de Glibc recommande de construire Glibc dans un répertoire de construction dédié :

mkdir -v ../glibc-build
cd ../glibc-build

Configurez maintenant la Glibc afin qu'elle installe les bibliothèques 64 bits dans /lib64 :

echo "libc_cv_slibdir=/lib64" >> config.cache

Préparez la compilation de Glibc :

CC="gcc ${BUILD64}" CXX="g++ ${BUILD64}" \
../glibc-2.25/configure \
    --prefix=/usr \
    --enable-kernel=3.12.0 \
    --libexecdir=/usr/lib64/glibc \
    --libdir=/usr/lib64 \
    --enable-obsolete-rpc \
    --enable-stack-protector=strong \
    --cache-file=config.cache

Voici la signification de la nouvelle option de configure :

--libexecdir=/usr/lib64/glibc

Cela modifie l'emplacement des liens en dur vers l'utilitaire getconf depuis leur emplacement par défaut /usr/libexec vers /usr/lib64/glibc.

Compilez le paquet :

make
[Important]

Important

À cause du rôle critque que joue Glibc dans un système fonctionnel, les développeurs de CLFS recommandent vivement de lancer la suite de tests.

Utilisez la commande suivante pour lancer la suite de tests et récupérer les tests en échec :

make check

La suite de tests de Glibc dépend grandement de certaines fonctionnalités du système hôte, en particulier du noyau. Les tests posix/annexc et conform/run-conformtest échouent normalement et vous devriez voir Error 1 (ignored) dans la sortie. En dehors de cela, la suite de tests de Glibc devrait réussir. Cependant, dans certaines circonstances, des échecs sont inévitables. Si un test échoue à cause d'un programme manquant (ou d'un lien symbolique manquant), ou d'une erreur de segmentation, vous verrez un code d'erreur supérieur à 127 et les détails se trouverent dans le journal. Plus couramment, les tests échoueront avec Error 2 — pour ceux-là, il faut vérifier le contenu des fichiers .out, par exemple posix/annexc.out. Voici une liste des problèmes les plus courants :

  • Les tests nptl/tst-clock2, nptl/tst-attr3, tst/tst-cputimer1 et rt/tst-cpuclock2 sont connus pour échouer. La raison n'est pas complètement comprise, mais des indications sont que des problèmes mineurs de temps peuvent déclencher ces échecs.

  • Les tests de math échouent parfois. Certains paramètres d'optimisation sont connus pour être en cause.

  • Si vous avez monté la partition CLFS avec l'option noatime, le test atime échouera. Comme indiqué dans Section 2.5, « Monter la nouvelle partition », n'utilisez pas l'option noatime lors de la construction de CLFS.

  • Lorsqu'ils sont lancés sur un matériel plus ancien et plus lent, certains tests peuvent échouer à cause du dépassement du temps limite. Modifier la commande make check pour indiquer TIMEOUTFACTOR permettrait d'éliminer ces erreurs (par exemple TIMEOUTFACTOR=16 make -k check).

  • posix/tst-getaddrinfo4 échouera toujours à cause de la connexion réseau manquante lorsque les tests sont lancés.

Installez le paquet et supprimez des fichiers inutiles de /usr/include/rpcsvc :

make install &&
rm -v /usr/include/rpcsvc/*.x

Installez le fichier de configuration et le répertoire d'exécution de nscd :

cp -v ../glibc-2.25/nscd/nscd.conf /etc/nscd.conf
mkdir -pv /var/cache/nscd

Installez les fichiers de support de systemd pour nscd :

install -v -Dm644 ../glibc-2.25/nscd/nscd.tmpfiles /usr/lib/tmpfiles.d/nscd.conf
install -v -Dm644 ../glibc-2.25/nscd/nscd.service /lib/systemd/system/nscd.service

10.8.2. Internationalization

Les locales qui permettent à votre système de répondre en une langue différente n'ont pas été installées par la commande au-dessus. Installez-les avec :

make localedata/install-locales

Pour gagner du temps, au lieu de lancer la commande précédente (qui génère et installe chaque locale listée dans glibc-2.25/localedata/SUPPORTED), installez seulement celles qui sont requises et que vous voulez. Cela peut se faire en utilisant la commande localedef. Des informations sur cette commande se trouvent dans le fichier INSTALL dans les sources de Glibc. Cependant, il existe un certain nombre de locales essentielles pour lancer des tests de futurs paquets, en particulier, les tests libstdc++ de GCC. Les instructions suivantes, plutôt que la cible install-locales ci-dessus, installera l'ensemble minimal de locales nécessaires pour que les tests réussissent :

mkdir -pv /usr/lib/locale
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 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 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 it_IT -f ISO-8859-1 it_IT
localedef -i ja_JP -f EUC-JP ja_JP

Certaines locales installées par la commande make localedata/install-locales ci-dessus ne sont pas supportées correctement par certaines applications dans CLFS et CBLFS. À cause des nombreux problèmes soulevés par les hypothèses des programmeurs qui ne sont plus vraies avec ces locales, CLFS ne devrait pas être utilisé avec des locales qui utilisent des jeux de caractères multi-octets (dont UTF-8) ou avec une écriture de droite à gauche. De nombreux correctifs non officiels et instables sont requis pour corriger ces problèmes et il a été décidé que les développeurs de CLFS ne supporteraient pas ces locales compliquées pour le moment. Cela s'applique aux locales ja_JP et fa_IR aussi — elles ont été installées uniquement pour que les tests de GCC et Gettext réussissent et le programme watch (du paquet Procps-ng) ne fonctionne pas correctement avec elles. Divers tentatives pour contourner ces restrictions sont documentées dans les astuces liées à la régionalisation.

10.8.3. Configuration de Glibc

Le fichier /etc/nsswitch.conf doit être créé parce que, bien que Glibc fournisse des valeurs par défaut lorsque ce fichier est corrompu ou absent, les valeurs par défaut de Glibc ne fonctionnent pas bien dans un environnement en réseau. Le fuseau horaire doit aussi être configuré.

Créez un nouveau fichier /etc/nsswitch.conf en lançant ce qui suit :

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

Installez les données de fuseau horaire :

tar -xf ../tzdata2017b.tar.gz

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

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

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

Voici la signification des commandes zic :

zic -L /dev/null ...

Ceci crée des fuseaux horaires posix, sans secondes intercalaires. Par convention, on met cela dans zoneinfo et dans zoneinfo/posix. Il faut mettre les fuseaux horaires POSIX dans zoneinfo, sinon diverses 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 ne pas donner de bons résultats.

zic -L leapseconds ...

Ceci crée de bons fuseaux horaires 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 vous moquez de la bonne heure, vous pouvez économiser 1.9Mio en ne mettant pas de répertoire right.

zic ... -p ...

Ceci crée le fichier posixrules. Nous utilisons New York car POSIX exige des règles temporelles d'enregistrement à jour quotidiennement pour respecter les règles américaines.

Pour déterminer dans quel fuseau horaire vous vous situez, lancez le script suivant :

tzselect

Après avoir répondu à quelques questions sur votre emplacement, le script affichera le nom du fuseau horaire (quelque chose comme EST5EDT ou Europe/Paris). Ensuite créez le fichier /etc/localtime en lançant :

cp -v /usr/share/zoneinfo/[xxx] \
    /etc/localtime

Remplacez [xxx] pour le nom du fuseau horaire que tzselect vous a donné (par exemple Europe/Paris).

10.8.4. Configuration du chargeur dynamique

Par défaut, le chargeur dynamique (/lib/ld-linux.so.2 pour les exécutables 32 bits, /lib64/ld-linux-x86-64.so.2 pour les exécutables 64 bits) cherche les bibliothèques dynamiques requises par les programmes à l'exécution dans /lib, /lib64, /usr/lib et /usr/lib64. Cependant, s'il y a des bibliothèques dans d'autres répertoires, ils doivent être ajoutés au fichier /etc/ld.so.conf pour que le chargeur dynamique puisse les trouver. Certains répertoires connus pour couramment contenir des bibliothèques supplémentaires sont /usr/local/lib, /usr/local/lib64, /opt/lib et /opt/lib64, donc ajoutez-les aux répertoires de recherche du chargeur dynamique.

Créez un nouveau fichier /etc/ld.so.conf en lançant ce qui suit :

cat > /etc/ld.so.conf << "EOF"
# Begin /etc/ld.so.conf

/usr/local/lib
/usr/local/lib64
/opt/lib
/opt/lib64

# End /etc/ld.so.conf
EOF

10.8.5. Contenu de Glibc

Programmes installés: catchsegv, gencat, getconf, getent, iconv, iconvconfig, ldconfig, ldd, lddlibc4, locale, localedef, makedb, mtrace, nscd, pcprofiledump, pldd, rpcgen, sln, sotruss, sprof, tzselect, xtrace, zdump, zic
Bibliothèques installées: ld.so, libBrokenLocale.[a,so], libSegFault.so, libanl.[a,so], libc.[a,so], libc_nonshared.a, libcidn.[a,so], libcrypt.[a,so], libdl.[a,so], libg.a, libieee.a, libm.[a,so], libmcheck.a, libmemusage.so, libnsl.a, libnss_compat.so, libnss_dns.so, libnss_files.so, libnss_hesiod.so, libnss_nis.so, libnss_nisplus.so, libpcprofile.so, libpthread.[a,so], libpthread_nonshared.a, libresolv.[a,so], librpcsvc.a, librt.[a,so], libthread_db.so, libutil.[a,so]
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/rpcsvc, /usr/include/scsi, /usr/include/sys, /usr/lib/audit, /usr/lib/gconv, /usr/lib/glibc, /usr/lib/locale, /usr/share/i18n, /usr/share/zoneinfo, /var/cache/ldconfig, /var/cache/nscd

Descriptions courtes

catchsegv

Peut être utilisé pour créer une trace de la pile lorsqu'un programme s'arrête avec une erreur de segmentation

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

Réalise une conversion de l'ensemble des caractères

iconvconfig

Crée des fichiers de configuration pour le module iconv

ldconfig

Configure les liens du chargeur dynamique

ldd

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

lddlibc4

Assiste ldd avec des fichiers objets

locale

Dit au compilateur d'activer ou désactiver l'utilisation des locales POSIX pour les opérations internes

localedef

Compile les spécifications de 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 mémoire et affiche un résumé dans un format lisible par un humain

nscd

Un démon pour les services de noms fournissant un cache pour les requêtes les plus communes

pcprofiledump

Affiche les informations générées par le profilage PC

pldd

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

rpcgen

Génère du code C pour implémenter le protocole RPC (Remote Procedure Call)

sln

Un programme lié statiquement qui crée des liens symboliques

sotruss

Retrace les procédures d'appel d'une bibliothèque partagée vers une commande indiqué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 correspondante

xtrace

Trace 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

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

libBrokenLocale

Utilisé par certains programme, comme Mozilla, pour résoudre des locales cassées

libSegFault

Le gestionnaire de signal d'erreur de segmentation

libanl

Une bibliothèque asynchrone de recherche de noms

libc

La principale bibliothèque C

libcidn

Utilisé en interne par Glibc pour la gestion des noms de domaine internationalisés dans la fonction getaddrinfo()

libcrypt

La bibliothèque de chiffrement

libdl

La bibliothèque de l'interface du chargeur dynamique

libg

Une bibliothèque à l'exécution pour g++

libieee

La bibliothèque pour les nombre à virgule flottante IEEE (Institute of Electrical and Electronic Engineers)

libm

La bibliothèque mathématique

libmcheck

Contient le code lancé au démarrage

libmemusage

Utilisé par memusage (inclut dans Glibc, mais pas construit dans un système CLFS de base car il a plus de dépendances) pour aider à la récupération d'informations sur l'utilisation de la mémoire par un programme

libnsl

La bibliothèque de services réseau

libnss

Les bibliothèques Name Service Switch, contenant 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

libpcprofile

Contient les fonctions de profilage utilisées pour suivre la quantité de temps CPU dépensé dans des lignes de code spécifiques

libpthread

La bibliothèque de threads POSIX

libresolv

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

librpcsvc

Contient des fonctions apportant différents services RPC

librt

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

libthread_db

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

libutil

Contient du code pour les fonctions « standard » utilisées par de nombreux outils Unix