10.7. Glibc-2.7

Le paquet Glibc 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 Glibc

[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. » Glibc fournit une implémentation d'iconv() et peut convertir de l'Unicode, du coup libiconv n'est pas requis sur un système CLFS.

Le système de construction de la Glibc 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 Glibc parce que les tests d'autoconf de Glibc donneraient alors des résultats faussés, défaussant ainsi notre but d'achever une construction propre.

Les correctifs suivants incorporent toutes les mises à jour issues de la branche 2.7 des développeurs de Glibc :

patch -Np1 -i ../glibc-2.7-branch_update-1A.patch

Le correctif suivant corrige un problème qui peut causer des erreurs de segmentation à l'exécution de localdef :

patch -Np1 -i ../glibc-2.7-localedef_segfault-1.patch

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

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

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

echo "slibdir=/lib" >> configparms

Préparez la compilation de Glibc :

CFLAGS="-mtune=generic -g -O2" \
    ../glibc-2.7/configure --prefix=/usr \
    --disable-profile --enable-add-ons --enable-kernel=2.6.0 \
    --libexecdir=/usr/lib/glibc --libdir=/usr/lib

Voici la signification de la nouvelle option de configure :

--libexecdir=/usr/lib/glibc

Ceci modifie 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 de Glibc est considérée comme critique. Ne la sautez sous aucun prétexte.

Testez les résultats :

make -k check >glibc-check-log 2>&1 ; grep Error glibc-check-log

La suite de tests Glibc 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 de Glibc 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 Glibc 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.7.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

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 glibc-2.7/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 de Glibc. 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 les livres CLFS et BLFS. À 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 Glibc

Le fichier /etc/nsswitch.conf doit être créé car, bien que Glibc en fournisse un par défaut lorsque ce fichier est manquant ou corrompu, les valeurs par défaut de Glibc 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"
# 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

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"
# Begin /etc/ld.so.conf

/usr/local/lib
/opt/lib

# End /etc/ld.so.conf
EOF

10.7.5. Contenu de Glibc

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], 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], libresolv.[a,so], librpcsvc.a, librt.[a,so], libthread_db.so et libutil.[a,so]

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

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 Glibc 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