6.9. Glibc-2.12.2

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 aproximatif de construction: 16.9 SBU
Espace disque requis: 637 Mio

6.9.1. Installation de Glibc

[Remarque]

Remarque

Certains paquets non compris dans LFS suggèrent d'installer GNU libiconv pour traduire les données d'un codage en un autre. La page d'accueil du projet (http://www.gnu.org/software/libiconv/) précise « 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 LFS.

Lors de l'exécution de make install, un script appelé test-installation.pl opère un test de propreté sur notre Glibc récemment installée. Cependant, notre chaîne d'outils pointant encore vers le répertoire /tools, le test de propreté pourrait se fier au mauvais Glibc. Nous pouvons forcer le script à tester la Glibc que nous venons d'installer en lançant ceci :

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

Le script shell ldd contient la syntaxe spécifique à Bash. Changez son programme interpréteur par défaut en /bin/bash si /bin/sh n'est pas installé comme décrit dans le chapitre Shells du livre BLFS :

sed -i 's|@BASH@|/bin/bash|' elf/ldd.bash.in

Corrigez un déséquilibre de pile qui survient dans certaines conditions :

sed -i '195,213 s/PRIVATE_FUTEX/FUTEX_CLOCK_REALTIME/' \
        nptl/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timed{rd,wr}lock.S

Utilisez /dev/erandom avec -fstack-protector-all :

sed -i 's@/dev/urandom@/dev/erandom@' ./sysdeps/unix/sysv/linux/dl-osinfo.h

Ajoutez le support de PaX à Glibc :

patch -Np1 -i ../glibc-2.12.2-pt_pax-1.patch
patch -Np1 -i ../glibc-2.12.2-dl_execstack-1.patch
patch -Np1 -i ../glibc-2.12.2-localedef_trampoline-1.patch

Ajoutez les fonctions de bibliothèque strlcpy et strlcat à Glibc :

patch -Np1 -i ../glibc-2.12.2-strlcpy_strlcat-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

Comme au chapitre 5, ajoutez à nouveau à CFLAGS les commutateurs du compilateur requis pour les machines x86. Ici, l'optimisation de la bibliothèque est également réglée pour le compilateur gcc pour gérer la vitesse de compilation (-pipe) et la performance des paquets (-O3).

case `uname -m` in
  i?86) echo "CFLAGS += -march=i486 -mtune=native -O3 -pipe" > configparms ;;
esac

Configurez le fichier the configparms pour construire les bibliothèques de Glibc en désactivant les durcissements :

cat >> configparms << "EOF"
build-programs=no
CC += -fPIC -fno-stack-protector -U_FORTIFY_SOURCE -nonow -nopie
CXX += -fPIC -fno-stack-protector -U_FORTIFY_SOURCE -nonow -nopie
EOF

Préparez la compilation de Glibc :

../glibc-2.12.2/configure --prefix=/usr \
    --disable-profile --enable-add-ons \
    --enable-kernel=2.6.22.5 --libexecdir=/usr/lib/glibc\
    --enable-bind-now --enable-stackguard-randomization

Voici la signification des options de configure :

--libexecdir=/usr/lib/glibc

Ceci modifie l'emplacement du programme pt_chown, par défaut /usr/libexec, par /usr/lib/glibc.

--enable-bind-now

Ceci configure Glibc pour utiliser l'option -z now de l'éditeur de liens.

--enable-stackguard-randomization

Ceci configure Glibc pour utiliser /dev/urandom avec -fstack-protector.

Compilez les bibliothèques :

make

Préparez le fichier configparms pour construire les programmes de Glibc :

cat > configparms << "EOF"
CC += -fPIE -fstack-protector-all -D_FORTIFY_SOURCE=2
CXX += -fPIE -fstack-protector-all -D_FORTIFY_SOURCE=2
CFLAGS-sln.c += -fno-PIC -fno-PIE
+link = $(CC) -pie -Wl,-O1 -nostdlib -nostartfiles -o $@ \
    $(sysdep-LDFLAGS) $(config-LDFLAGS) $(LDFLAGS) $(LDFLAGS-$(@F)) \
    $(combreloc-LDFLAGS) $(relro-LDFLAGS) $(hashstyle-LDFLAGS) \
    -Wl,-z,now -Wl,--warn-shared-textrel,--fatal-warnings \
    $(addprefix $(csu-objpfx),S$(start-installed-name)) \
    $(+preinit) $(+prectorS) \
    $(filter-out $(addprefix $(csu-objpfx),start.o \
    S$(start-installed-name))\
    $(+preinit) $(link-extra-libs) \
    $(common-objpfx)libc% $(+postinit),$^) \
    $(link-extra-libs) $(link-libc) $(+postctorS) $(+postinit)
EOF
case `uname -m` in
  i?86) echo "CFLAGS += -march=i486 -mtune=native" >> configparms ;;
esac

Compilez les programmes :

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.

Pour tester les résultats, créez d'abord un nouveau fichier configparms pour désactiver la plupart des options de durcissement :

cat > configparms << "EOF"
CC += -fPIC -fno-stack-protector -U_FORTIFY_SOURCE -nonow -nopie -norelro -no-fatal-warnings
CXX += -fPIC -fno-stack-protector -U_FORTIFY_SOURCE -nonow -nopie -norelro -no-fatal-warnings
EOF
case `uname -m` in
  i?86) echo "CFLAGS += -march=i486 -mtune=native" >> configparms ;;
esac

Avant de lancer les tests, copiez un fichier de l'arborescence du code source dans l'arborescence de notre construction pour empêcher deux échecs de test, puis testez les résultats :

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

Vous verrez probablement un échec attendu (ignoré) lors des tests de posix/annexc. En outre, La suite de tests Glibc est quelque peu dépendante du système hôte. Voici une liste des problèmes les plus fréquents :

  • Le test nptl/tst-cancel1 échouera si vous utilisez les séries 4.1 de GCC.

  • Les tests nptl/tst-clock2, nptl/tst-attr3 et rt/tst-cpuclock2 échouent souvent. On n'a pas encore totalement compris la raison, mais des indications laissent penser que des problèmes mineurs de temps peuvent être à l'origine de ces échecs.

  • Les tests math échouent quelque fois lors de leur exécution sur des systèmes où le processeur n'est pas un Intel ou un AMD authentique.

  • Si vous avez monté la partition LFS 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 LFS.

  • Lors d'une exécution sur un matériel ancien et lent, quelques tests peuvent échouer à cause de délais de test dépassés. La modification de la commande make check pour paramétrer un TIMEOUTFACTOR a été signalée comme aidant à éliminer ces erreurs (par exemple TIMEOUTFACTOR=16 make -k check).

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

Installez la page de man de strlcpy :

cp -v ../glibc-2.12.2/manual/strlcpy.3 /usr/share/man/man3

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.

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_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 ja_JP -f EUC-JP ja_JP
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.12.2/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.12.2/localedata/SUPPORTED dans le cas peu probable où vous en auriez besoin.

6.9.2. Configurer Glibc

Le fichier /etc/nsswitch.conf doit être créé parce que, 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 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

Pour déterminer dans quel fuseau horaire vous vous situez, lancez 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 America/Edmonton). Il y a aussi d'autres fuseaux horaires listés dans /usr/share/zoneinfo comme Canada/Eastern 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 :

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 de se couvrir de la situation où /usr serait une partition séparée. Ceci pourrait arriver, par exemple, en démarrant en mode utilisateur unique.

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

/usr/local/lib
/opt/lib

# End /etc/ld.so.conf
EOF

6.9.4. 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}, 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, 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/glibc, /usr/lib/locale, /usr/share/i18n, /usr/share/zoneinfo

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

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 ln lié statiquement

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é 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.12.2/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

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

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