6.9.1. Installation de Glibc
Note
Le système de construction de Glibc est auto-extractible et il
s'installera parfaitement, même si le fichier specs du
compilateur et l'éditeur de liens pointent vers /tools
. Les specs et l'éditeur de liens ne
peuvent pas être ajustés avant l'installation de Glibc, car les
tests autoconf de Glibc donneraient de faux résultats, ce qui
irait à l'encontre du but de faire une construction propre.
Certains programmes de Glibc utilisent le répertoire non conforme
au FHS /var/db
pour stocker leurs
données d'exécution. Appliquez le correctif pour que ces programmes
stockent leurs données à des endroits respectant le FHS :
patch -Np1 -i ../glibc-2.30-fhs-1.patch
Corrigez un problème introduit dans linux-5.2 :
sed -i '/asm.socket.h/a# include <linux/sockios.h>' \
sysdeps/unix/sysv/linux/bits/socket.h
Créez un lien symbolique pour se conformer à la LSB. De plus, pour
x86_64, créez un lien symbolique de compatibilité requis pour que
le chargeur dynamique fonctionne correctement :
case $(uname -m) in
i?86) ln -sfv ld-linux.so.2 /lib/ld-lsb.so.3
;;
x86_64) ln -sfv ../lib/ld-linux-x86-64.so.2 /lib64
ln -sfv ../lib/ld-linux-x86-64.so.2 /lib64/ld-lsb-x86-64.so.3
;;
esac
La documentation de Glibc recommande de construire Glibc dans un
répertoire de construction dédié :
mkdir -v build
cd build
Préparez la compilation de Glibc :
CC="gcc -ffile-prefix-map=/tools=/usr" \
../configure --prefix=/usr \
--disable-werror \
--enable-kernel=3.2 \
--enable-stack-protector=strong \
--with-headers=/usr/include \
libc_cv_slibdir=/lib
Voici la signification des options et des nouveaux
paramètres de configure :
-
CC="gcc
-ffile-prefix-map=/tools=/usr"
-
Fait en sorte que GCC enregistre les références aux fichiers
dans /tools dans le résultat de la compilation comme s'ils
étaient dans /usr. Cela évite d'introduire des chemins
invalides dans les symboles de débogage.
-
--disable-werror
-
Cette option désactive l'option -Werror passée à GCC. Ceci
est nécessaire pour lancer la suite de tests.
-
--enable-stack-protector=strong
-
Cette option augmente la sécurité du système en ajoutant du
code supplémentaire pour repérer les dépassements de tampon
comme dans les attaques par la pile.
-
--with-headers=/usr/include
-
Cette option dit au système de construction où se trouvent
les en-têtes de l'API du noyau. Par défaut il cherche ces
en-têtes dans /tools/include
.
-
libc_cv_slibdir=/lib
-
Cette variable indique la bibliothèque correcte pour chaque
système. Nous ne voulons pas utiliser lib64.
Compilez le paquet :
make
Important
Dans cette section, la suite de tests de Glibc est considérée
comme critique. Ne la sautez sous aucun prétexte.
En général, quelques tests ne réussissent pas, mais vous pouvez le
plus souvent ignorer les échecs listés ci-dessous.
case $(uname -m) in
i?86) ln -sfnv $PWD/elf/ld-linux.so.2 /lib ;;
x86_64) ln -sfnv $PWD/elf/ld-linux-x86-64.so.2 /lib ;;
esac
Note
Le lien symbolique ci-dessus est requis pour lancer les tests à
cette étape de la construction dans l'environnement chroot. Il
sera supprimé dans la phase d'installation en dessous.
make check
Vous verrez probablement quelques échecs lors des tests. La suite
de tests de Glibc est quelque peu dépendante du système hôte. Voici
une liste des problèmes les plus fréquents dans certaines versions
de LFS :
-
misc/tst-ttyname est
connu pour échouer dans l'environnement chroot de LFS.
-
inet/tst-idna_name_classify est
connu pour échouer dans l'environnement chroot de LFS.
-
posix/tst-getaddrinfo4
et posix/tst-getaddrinfo5 sont connus
pour échouer sur certaines architectures.
-
Le test nss/tst-nss-files-hosts-multi peut
échouer pour des raisons non encore déterminées.
-
Les tests rt/tst-cputimer{1,2,3} dépendent
du noyau du système hôte. Les noyaux 4.14.91–4.14.96,
4.19.13–4.19.18 et 4.20.0–4.20.5 sont connus pour causer des
échecs sur ces tests.
-
Les tests de math échouent parfois sur des systèmes où le
processeur n'est pas un intel relativement récent ou un AMD.
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
Corrigez le Makefile généré pour passer un test de cohérence
inutile qui échoue dans l'environnement partiel de LFS :
sed '/test-installation/s@$(PERL)@echo not running@' -i ../Makefile
Installez le paquet :
make install
Installez le fichier de configuration et le répertoire d'exécution
de nscd :
cp -v ../nscd/nscd.conf /etc/nscd.conf
mkdir -pv /var/cache/nscd
Ensuite, installez les locales qui permettent à votre système de
répondre en une langue différente. 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 POSIX -f UTF-8 C.UTF-8 2> /dev/null || true
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 el_GR -f ISO-8859-7 el_GR
localedef -i en_GB -f UTF-8 en_GB.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 it_IT -f UTF-8 it_IT.UTF-8
localedef -i ja_JP -f EUC-JP ja_JP
localedef -i ja_JP -f SHIFT_JIS ja_JP.SIJS 2> /dev/null || true
localedef -i ja_JP -f UTF-8 ja_JP.UTF-8
localedef -i ru_RU -f KOI8-R ru_RU.KOI8-R
localedef -i ru_RU -f UTF-8 ru_RU.UTF-8
localedef -i tr_TR -f UTF-8 tr_TR.UTF-8
localedef -i zh_CN -f GB18030 zh_CN.GB18030
localedef -i zh_HK -f BIG5-HKSCS zh_HK.BIG5-HKSCS
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.30/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.30/localedata/SUPPORTED
dans le cas peu
probable où vous en auriez besoin.
Note
Glibc utilise maintenant libidn2 lors de la résolution de noms de
domaines internationalisés. C'est une dépendance à l'exécution.
Si cette fonctionnalité est requise, les instructions pour
installer libidn2 se trouvent sur la
page libidn2 de BLFS.
6.9.2. Configurer Glibc
6.9.2.1. Ajout de nsswitch.conf
Le fichier /etc/nsswitch.conf
doit
être créé parce que les valeurs par défaut de Glibc ne
fonctionnent pas bien dans un environnement en réseau.
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
6.9.2.2. Ajout des données de fuseaux horaires
Installez et configurez les données de fuseaux horaires avec ce
qui suit :
tar -xf ../../tzdata2019b.tar.gz
ZONEINFO=/usr/share/zoneinfo
mkdir -pv $ZONEINFO/{posix,right}
for tz in etcetera southamerica northamerica europe africa antarctica \
asia australasia backward pacificnew systemv; do
zic -L /dev/null -d $ZONEINFO ${tz}
zic -L /dev/null -d $ZONEINFO/posix ${tz}
zic -L leapseconds -d $ZONEINFO/right ${tz}
done
cp -v zone.tab zone1970.tab iso3166.tab $ZONEINFO
zic -d $ZONEINFO -p America/New_York
unset ZONEINFO
Voici la signification de la commande
zic :
-
zic -L
/dev/null ...
-
Ceci crée des fuseaux horaires posix, sans secondes
intercalaires. Par convention, on met cela dans
zoneinfo
et dans zoneinfo/posix
. Il faut mettre les
fuseaux horaires POSIX dans zoneinfo
, sinon diverses suites de tests
renverront des erreurs. Sur un système embarqué, où il y a
peu de place et vous ne souhaitez pas mettre à jour les
fuseaux horaires, vous pouvez économiser 1.9 Mo en
n'utilisant pas le répertoire posix
, mais certaines applications ou
suites de tests pourraient ne pas donner de bons résultats.
-
zic -L
leapseconds ...
-
Ceci crée de bons fuseaux horaires incluant les secondes
intercalaires. Sur un système embarqué, où il y a peu de
place et vous ne souhaitez pas mettre à jour les fuseaux
horaires, ou si vous vous moquez de la bonne heure, vous
pouvez économiser 1.9Mio en ne mettant pas de répertoire
right
.
-
zic ... -p
...
-
Ceci crée le fichier posixrules
. Nous utilisons New York car
POSIX exige des règles temporelles d'enregistrement à jour
quotidiennement pour respecter les règles américaines.
Une façon de déterminer dans quel fuseau horaire vous vous situez
consiste à lancer 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
Europe/Paris). Il y a
aussi d'autres fuseaux horaires listés dans /usr/share/zoneinfo
comme America/Montreal 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 :
ln -sfv /usr/share/zoneinfo/<xxx>
/etc/localtime
Remplacez <xxx>
par le nom du fuseau horaire sélectionné (par exemple
America/Montreal).
6.9.2.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"
# Début de /etc/ld.so.conf
/usr/local/lib
/opt/lib
EOF
Si vous le désirez, le chargeur dynamique peut également chercher
un répertoire et inclure le contenu de fichiers qui s'y trouvent.
Les fichiers de ce répertoire include sont en général constitués
d'une ligne spécifiant le chemin vers la bibliothèque désirée.
Pour ajouter cette possibilité, lancez les commandes
suivantes :
cat >> /etc/ld.so.conf << "EOF"
# Ajout d'un répertoire include
include /etc/ld.so.conf.d/*.conf
EOF
mkdir -pv /etc/ld.so.conf.d