6.9. Glibc-2.26

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.

Temps de construction approximatif: 20 SBU
Espace disque requis: 2.0 Go

6.9.1. Installation de Glibc

[Note]

Note

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.

Certains programmes de Glibc utilisent un répertoire /var/db qui n'est pas conforme au FHS, pour stocker leurs données d'exécution. Appliquez le correctif pour que ces programmes stockent leurs données à des endroits respectant le FHS :

patch -Np1 -i ../glibc-2.26-fhs-1.patch

Tout d'abord, créez un lien symbolique de compatibilité pour éviter de référencer /tools dans notre glibc finale :

ln -sfv /tools/lib/gcc /usr/lib

Déterminez le répertoire d'en-têtes de GCC et créez un lien symbolique pour se conformer à la LSB. De plus, pour x86_64, créez un lien symbolique de compatibilité requis pour que le chargeur dynamique fonctionne correctement :

case $(uname -m) in
    i?86)    GCC_INCDIR=/usr/lib/gcc/$(uname -m)-pc-linux-gnu/7.2.0/include
            ln -sfv ld-linux.so.2 /lib/ld-lsb.so.3
    ;;
    x86_64) GCC_INCDIR=/usr/lib/gcc/x86_64-pc-linux-gnu/7.2.0/include
            ln -sfv ../lib/ld-linux-x86-64.so.2 /lib64
            ln -sfv ../lib/ld-linux-x86-64.so.2 /lib64/ld-lsb-x86-64.so.3
    ;;
esac

Supprimez un fichier qui pourrait rester d'une construction précédente :

rm -f /usr/include/limits.h

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

mkdir -v build
cd       build

Préparez la compilation de Glibc :

CC="gcc -isystem $GCC_INCDIR -isystem /usr/include" \
../configure --prefix=/usr                          \
             --disable-werror                       \
             --enable-kernel=3.2                    \
             --enable-stack-protector=strong        \
             libc_cv_slibdir=/lib
unset GCC_INCDIR

Voici la signification des options et des nouveaux paramètres de configure :

CC="gcc -isystem $GCC_INCDIR -isystem /usr/include"

Indiquer l'emplacement des répertoires d'en-têtes de gcc et du système évite d'introduire des chemins invalides dans les symboles de débogage.

--disable-werror

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

--enable-stack-protector=strong

Cette option augment la sécurité du système en ajoutant un canari connu (un entier aléatoire) à la pile au début de chaque fonction, et le vérifie au retour de la fonction. S'il a changé, il y a eu un dépassement de la pile et le programme s'arrête.

libc_cv_slibdir=/lib

Cette variable indique la bibliothèque correcte 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 la sautez sous aucun prétexte.

En général, quelques tests ne réussissent pas mais vous pouvez le plus souvent ignorer les échecs listés ci-dessous. Maintenant, testez les résultats de la construction :

make check

Vous verrez probablement quelques échecs lors des tests. la suite de tests de Glibc est quelque peu dépendante du système hôte. Voici une liste des problèmes les plus fréquents dans certaines versions de LFS :

  • posix/tst-getaddrinfo4 et posix/tst-getaddrinfo5 sont connus pour échouer sur certaines architectures.

  • Les tests 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 sur des systèmes où le processeur n'est pas un intel relativement récent ou un AMD.

  • Les tests nptl/tst-thread-affinity-{pthread,pthread2,sched} peuvent échouer pour des raisons non encore déterminées.

  • Les autres tests connu pour échouer sur certaines architectures sont malloc/tst-malloc-usable et nptl/tst-cleanupx4.

Bien que ce ne soit qu'un simple message, l'étape d'installation de Glibc se plaindra de 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 passer un test de cohérence inutile qui échoue dans l'environnement partielle de LFS :

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

Installez le paquet :

make install

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

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

Installez le fichier de support de nscd pour systemd :

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

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

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

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 de_DE -f UTF-8 de_DE.UTF-8
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_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 it_IT -f ISO-8859-1 it_IT
localedef -i it_IT -f UTF-8 it_IT.UTF-8
localedef -i ja_JP -f EUC-JP ja_JP
localedef -i ru_RU -f KOI8-R ru_RU.KOI8-R
localedef -i ru_RU -f UTF-8 ru_RU.UTF-8
localedef -i tr_TR -f UTF-8 tr_TR.UTF-8
localedef -i zh_CN -f GB18030 zh_CN.GB18030

En outre, installez la locale de votre pays, de votre langue et de votre codage.

Vous pouvez alternativement installer les locales listées dans le fichier glibc-2.26/localedata/SUPPORTED (il inclut toutes les locales citées ci-dessus et d'autres) en une fois avec la commande suivante qui prend beaucoup de temps :

make localedata/install-locales

Puis utilisez la commande localedef pour créer et installer les locales non listées dans le fichier glibc-2.26/localedata/SUPPORTED dans le cas peu probable où vous en auriez besoin.

6.9.2. Configurer Glibc

6.9.2.1. Ajout de nsswitch.conf

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

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

6.9.2.2. Ajout des données timezone

Installez et configurez les données de timezone avec ce qui suit :

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 de la commande 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.

Une façon de déterminer dans quel fuseau horaire où vous situez consiste à lancer 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 Europe/Paris). Il y a aussi d'autres fuseaux horaires listés dans /usr/share/zoneinfo comme America/Montreal 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 lançant :

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

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

6.9.2.3. Configurer le chargeur dynamique

Par défaut, le chargeur dynamique (/lib/ld-linux.so.2) cherche dans /lib et /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 /lib et /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 connus pour contenir des bibliothèques supplémentaires, donc ajoutez ces deux répertoires au chemin 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"
# Début de /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 de 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é, lancez les commandes suivantes :

cat >> /etc/ld.so.conf << "EOF"
# Ajout d'un répertoire include
include /etc/ld.so.conf.d/*.conf

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

6.9.3. Contenu de Glibc

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

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

Affiche diverses informations sur la locale courante

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

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 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-2.26.so

Le 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 locales cassées (comme certaines applications Motif). Voir les commentaires dans glibc-2.26/locale/broken_cur_max.c pour plus d'informations

libSegFault

Un gestionnaire de signaux d'erreurs de segmentation, utilisé par catchsegv

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

Bibliothèque factice ne contenant aucune fonction. C'était auparavant une bibliothèque d'exécution pour g++

libieee

Un lien vers ce module provoque volontairement des règles de gestion d'erreur pour les fonctions math telles que définies par l'Institute of Electrical and Electronic Engineers (IEEE). Le paramètre par défaut est la gestion de l'erreur POSIX.1

libm

La bibliothèque mathématique

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

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

libpthread

La bibliothèque 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