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
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
For TLS support on the Sparc64 we will need to add the following lines to
config.cache
:
echo "libc_cv_sparc64_tls=yes" >> config.cache
Dites à Glibc d'installer ses bibliothèques dans
/lib
:
echo "slibdir=/lib" >> configparms
Préparez la compilation de Glibc :
CC="gcc ${BUILD64}" ../glibc-2.7/configure --prefix=/usr \
--disable-profile --enable-add-ons --enable-kernel=2.6.0 \
--libexecdir=/usr/lib/glibc --libdir=/usr/lib \
--cache-file=config.cache
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
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
Installez le paquet :
make install
The stubs.h header installed by glibc looks for stubs-32.h
and stubs-64.h. This configuration of glibc only generates stubs-64.h. Fix
this with the following:
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 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.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"
# 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 |