10.7. EGLIBC-2.13

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

[Note]

Note

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 correctif suivant corrige un problème où EGLIBC gèrera mal une condition au terme de laquelle un binaire elf a des dépendances manquantes :

patch -Np1 -i ../eglibc-2.13-r13356-dl_dep_fix-1.patch

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.

MIPS is not supported in the main EGLIBC tree, so we need the eglibc-ports tarball. After entering the EGLIBC source dir, unpack eglibc-ports-2.13 and rename the directory it creates so that EGLIBC's build system can find it:

tar -jxvf ../eglibc-ports-2.13.tar.bz2
mv -v eglibc-ports-2.13 ports

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

Préparez la compilation d'EGLIBC :

../eglibc-2.13/configure --prefix=/usr \
    --disable-profile --enable-add-ons --enable-kernel=2.6.0 \
    --libexecdir=/usr/lib/eglibc

Voici la signification de la nouvelle option de configure :

--libexecdir=/usr/lib/glibc

Ceci change l'emplacement du programme pt_chown 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.13/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

Installez le paquet :

make install

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.13/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

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. Configuring The Dynamic Loader

By default, the dynamic loader (/lib/ld.so.1) searches through /lib and /usr/lib for dynamic libraries that are needed by programs as they are run. However, if there are libraries in directories other than /lib and /usr/lib, these need to be added to the /etc/ld.so.conf file in order for the dynamic loader to find them. Two directories that are commonly known to contain additional libraries are /usr/local/lib and /opt/lib, so add those directories to the dynamic loader's search path.

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, mtrace, nscd, pcprofiledump, pt_chown, rpcgen, rpcinfo, 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

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

pt_chown

Un programme d'aide pour que grantpt initialise les droits des propriétaires, groupes et autres d'un pseudo-terminal esclave

rpcgen

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

rpcinfo

Fait un appel RPC à un serveur RPC

sln

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

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