10.7. EGLIBC-2.18

Le paquet EGLIBC contient la bibliothèque C principale. Cette bibliothèque fournit toutes les routines de base pour allouer de la mémoire, rechercher dans des répertoires, ouvrir et fermer des fichiers, les lire et les écrire, gérer les chaînes, faire de la recherche de motifs, faire de l'arithmétique etc.

10.7.1. Installation de EGLIBC

[Remarque]

Remarque

Certains paquets non compris dans CLFS suggèrent d'installer GNU libiconv pour traduire les données d'un encodage en un autre. La page d'accueil du projet (http://www.gnu.org/software/libiconv/) précise que « Cette bibliothèque fournit une implémentation de iconv() à utiliser sur les systèmes qui n'en disposent pas ou dont l'implémentation ne convertit pas l'Unicode. » EGLIBC fournit une implémentation d'iconv() et peut convertir de l'Unicode, du coup libiconv n'est pas requis sur un système CLFS.

À la fin de l'installation, le système de construction exécutera un test de propreté pour s'assurer que tout s'est installé correctement. Ce script essaiera de tester la présence d'une bibliothèque utilisée uniquement pour la suite de tests, et elle n'est jamais installée. Empêchez le script de tester la présence de cette bibliothèque avec la commande suivante :

sed -i 's/\(&& $name ne\) "db1"/ & \1 "nss_test1"/' scripts/test-installation.pl

Ce même script effectue ses tests en essayant de compiler des programmes de test contre certaines bibliothèques. Cependant, il ne spécifie pas le ld.so, or notre ensemble d'outils est configuré pour utiliser celui de /tools. L'ensemble de commandes suivant obligera le script à utiliser le chemin complet du nouveau ld.so qu'on vient d'installer :

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

Le système de construction d'EGLIBC est autosuffisant et s'installe parfaitement, même si notre fichier specs pour le compilateur et l'éditeur de liens pointent toujours vers /tools. Les specs et l'éditeur de liens ne peuvent pas être ajustés avant l'installation de la EGLIBC parce que les tests d'autoconf d'EGLIBC donneraient alors des résultats faussés, défaussant ainsi notre but d'achever une construction propre.

La documentation d'EGLIBC recommande de construire EGLIBC en dehors du répertoire des sources dans un répertoire de construction dédié :

mkdir -v ../eglibc-build
cd ../eglibc-build

Dites à EGLIBC d'installer ses bibliothèques dans /lib :

echo "slibdir=/lib" >> configparms

Préparez la compilation d'EGLIBC :

CFLAGS="-O2" \
     ../eglibc-2.18/configure --prefix=/usr \
    --disable-profile --enable-kernel=2.6.32 \
    --libexecdir=/usr/lib/eglibc --libdir=/usr/lib \
    --enable-obsolete-rpc

Voici la signification de la nouvelle option de configure :

--libexecdir=/usr/lib/glibc

Ceci modifie l'emplacement de l'outil getconf de celui par défaut /usr/libexec vers /usr/lib/glibc.

Compilez le paquet :

make
[Important]

Important

La suite de tests d'EGLIBC est considérée comme critique. Ne la sautez sous aucun prétexte.

Testez les résultats :

cp -v ../eglibc-2.18/iconvdata/gconv-modules iconvdata
make -k check 2>&1 | tee eglibc-check-log; grep Error eglibc-check-log

La suite de tests EGLIBC est très dépendante de certaines fonctions du système hôte, en particulier du noyau. Normalement, le test posix/annexc échoue et vous devriez voir Error 1 (ignored) dans la sortie. Excepté cela, la suite de tests d'EGLIBC devrait toujours passer. Néanmoins, dans certaines circonstances, certains échecs sont inévitables. Si un test échoue à cause d'un programme manquant (ou d'un lien symbolique manquant), ou du fait d'une erreur de segmentation, vous verrez un code d'erreur supérieur à 127 et les détails seront dans le journal. De manière plus générale, les tests échoueront avec Error 2 - pour eux le contenu du fichier .out, comme posix/annexc.out peut vous donner des informations. Voici une liste des problèmes les plus fréquents :

  • Les tests math échouent quelque fois. Certaines optimisations sont connues pour être une cause de cela.

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

  • Lors d'une exécution sur un matériel ancien et lent, quelques tests peuvent échouer à cause de délais dépassés.

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

touch /etc/ld.so.conf

L'installation va finir en vérifiant que tout est correctement installé. Malheureusement, il va tester pour une installation multilib. Sur x86_64 Pure64, cela signifie qu'il va essayer de tester un chargeur 32 bits inexistant qui a un nom différent du chargeur 64 bits (contrairement aux autres architectures 64 bits). On le trompe en créant un lien symbolique vers le chargeur réel.

ln -sv ld-2.18.so /lib/ld-linux.so.2

Installez le paquet :

make install

Maintenant, nous pouvons supprimer ce lien symbolique. Nous avons aussi besoin de corriger le script /usr/bin/ldd - si vous le regardez, vous verrez qu'il ne se réfère pas seulement à l'éditeur de liens 32 bits mais aussi à /lib64 où il pense que se trouve l'éditeur de liens. Le sed suivant va corriger cela :

rm -v /lib/ld-linux.so.2
cp -v /usr/bin/ldd{,.bak}
sed '/RTLDLIST/s%/ld-linux.so.2 /lib64%%' /usr/bin/ldd.bak >/usr/bin/ldd

Vérifiez le script pour être sûr que le sed a fonctionné correctement puis effacez la sauvegarde.

rm -v /usr/bin/ldd.bak

L'en-tête stubs.h installée par EGLIBC cherche stubs-32.h et stubs-64.h. Cette configuration d'EGLIBC ne génère qu'un stubs-64.h. Corrigez cela avec ce qui suit :

mv -v /usr/include/gnu/stubs{-64,}.h

10.7.2. Internationalisation

Les locales qui permettent à votre système de répondre en une langue différente n'ont pas été installées avec la commande ci-dessus. Aucune n'est indispensable, mais si certaines sont absentes, les suites de test des futurs paquets peuvent sauter des situations de test importantes.

make localedata/install-locales

Pour gagner du temps, une alternative au lancement de la commande précédente (qui génère et installe toutes les locales listées dans le fichier EGLIBC-2.18/localedata/SUPPORTED est de n'installer que les locales nécessaires et exigées. Vous pouvez faire cela avec la commande localedef. Des informations sur cette commande se trouvent dans le fichier INSTALL des sources d'EGLIBC. Néanmoins, il y a un nombre de locales essentielles pour que les tests des paquets à venir passent, en particulier les tests libstdc++ de GCC. Les instructions suivantes au lieu de la cible install-locales utilisée ci-dessus, installeront l'ensemeble minimal des locales nécessaires pour que les tests s'exécutent avec succès :

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 qui sont dans CLFS et CBLFS. À la vue des divers problèmes survenus du fait de certains présupposés des programmeurs de certaines applications, lesquelles se cassent dans de telles locales, vous ne devriez pas utiliser CLFS dans des locales utilisant des encodages multioctets (y compris UTF-8) ou le sens d'écriture de droite à gauche. De nombreux correctifs non officiels et instables sont nécessaires pour corriger ces problèmes et les développeurs de CLFS ont décidé de ne pas supporter des locales complexes pour l'instant. Ceci s'applique aux locales ja_JP et fa_IR — elles n'ont été installées que pour que les tests de GCC et de Gettext passent et le programme watch (qui fait partie du paquet Procps) ne fonctionne pas correctement avec elles. Diverses solutions pour contourner ces restrictions sont documentées dans les astuces liées à l'internationalisation.

10.7.3. Configurer EGLIBC

Le fichier /etc/nsswitch.conf doit être créé car, bien que EGLIBC en fournisse un par défaut lorsque ce fichier est manquant ou corrompu, les valeurs par défaut d'EGLIBC ne fonctionnent pas bien dans un environnement en réseau. De plus, le fuseau horaire a besoin d'être configuré.

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

cat > /etc/nsswitch.conf << "EOF"
# Début de /etc/nsswitch.conf

passwd: files
group: files
shadow: files

hosts: files dns
networks: files

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

# Fin de /etc/nsswitch.conf
EOF

Installez les données de fuseau horaire :

tar -xf ../tzdata2013g.tar.gz

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

for tz in etcetera southamerica northamerica europe africa antarctica  \
          asia australasia backward pacificnew solar87 solar88 solar89 \
          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 iso3166.tab $ZONEINFO
zic -d $ZONEINFO -p America/New_York
unset ZONEINFO

Voici la signification de ces commandes :

zic -L /dev/null ...

Ceci crée des fuseaux horaires posix sans décalage de secondes. Par convention, on les met dans zoneinfo et dans zoneinfo/posix. Il faut mettre les fuseaux horaires POSIX dans zoneinfo, sans quoi plusieurs suites de tests renverront des erreurs. Sur un système embarqué, où l'espace est limité et où vous ne souhaitez jamais mettre à jour les fuseaux horaires, vous pouvez économiser 1.9Mo en n'utilisant pas le répertoire posix, mais il se peut que les suites de tests de certaines applications donnent de moins bons résultats

zic -L leapseconds ...

Ceci crée des fuseaux horaires incluant les sauts de secondes. Sur un système embarqué, où l'espace est limité et où vous ne souhaitez jamais mettre à jour les fuseaux horaires, vous pouvez économiser 1.9Mo en ne mettant pas de répertoire right.

zic ... -p ...

Cela crée le fichier posixrules. Nous utilisons New York car POSIX exige des règles d'heures de sauvegarde quotidiennes correspondant aux règles américaines.

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

tzselect

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

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

Remplacez [xxx] par le nom du fuseau horaire sélectionné (par exemple Canada/Eastern).

Voici la signification de l'option de cp :

--remove-destination

Ceci est nécessaire pour forcer la suppression du lien symbolique déjà existant. La raison pour laquelle nous copions plutôt que de simplement créer un lien symbolique est d'anticiper la situation où /usr est une partition séparée. Ceci pourrait être important en démarrant en mode utilisateur unique.

10.7.4. Configurer le chargeur dynamique

Par défaut, le chargeur dynamique (/lib/ld-linux-x86-64.so.2) cherche dans /lib et /usr/lib les bibliothèques dynamiques nécessaires aux programmes lors de leur exécution. Cependant, s'il y a des bibliothèques dans d'autres répertoires que /lib et /usr/lib, ils doivent être ajoutés au fichier /etc/ld.so.conf afin que le chargeur dynamique les trouve. Deux répertoires qui sont couramment connus pour contenir des bibliothèques supplémentaires sont /usr/local/lib et /opt/lib, donc ajoutez ces répertoires aux chemins recherchés par le 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

# Fin de /etc/ld.so.conf
EOF

10.7.5. Contenu d'EGLIBC

Programmes installés: catchsegv, gencat, getconf, getent, iconv, iconvconfig, ldconfig, ldd, lddlibc4, locale, localedef, makedb, mtrace, nscd, pcprofiledump, pldd, rpcgen, sln, sprof, tzselect, xtrace,zdump, et zic
Bibliothèques installées: ld.so, libBrokenLocale.[a,so], libSegFault.so, libanl.[a,so], libbsd-compat.a, 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 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/gconv, /usr/lib/eglibc, /usr/lib/locale, /usr/share/i18n, /usr/share/zoneinfo, /var/cache/ldconfig

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 la configuration syitème pour les variables spécifiques à un système de fichiers

getent

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

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 de désactiver l'utilisation des locales POSIX pour les opérations construites en dur

localedef

Compile les spécifications de locale

makedb

Crée une base de données à 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 des informations générées par un profilage du PC

pldd

Liste les objets partagés dynamiques utilisés en lançant 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

Trace les appels de procédures de bibliothèque partagée d'une 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 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ée par des programmes comme Mozilla pour résoudre des locales cassées

libSegFault

Le gestionnaire de signaux d'erreurs de segmentation

libanl

Une bibliothèque asynchrone de recherche de noms

libbsd-compat

Fournit la portabilité nécessaire pour faire fonctionner certains programmes BSD (Berkeley Software Distribution) sous Linux

libc

La principale bibliothèque C

libcidn

Utilisé en interne par EGLIBC pour la gestion des noms de domaine internationaux dans la fonction getaddrinfo()

libcrypt

La bibliothèque de chiffrement

libdl

La bibliothèque de l'interface du chargeur dynamique

libg

Une bibliothèque d'exécution en cours pour g++

libieee

La bibliothèque de points flottants de Institute of Electrical and Electronic Engineers (IEEE).

libm

La bibliothèque mathématique

libmcheck

Contient du code exécuté au démarrage

libmemusage

Utilisé par memusage (compris dans EeGLIBC mais pas compilé dans un système CLFS de base car il a des dépendances supplémentaires) 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 des fonctions de profilage utilisées pour tracer le temps CPU dépensé sur les lignes de code source

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 « standards » utilisées par de nombreux outils Unix