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 un répertoire /var/db
qui n'est pas conforme au FHS, 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.26-fhs-1.patch
Tout d'abord, créez un lien symbolique de compatibilité pour éviter
de référencer /tools dans notre glibc finale :
ln -sfv /tools/lib/gcc /usr/lib
Déterminez le répertoire d'en-têtes de GCC et 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) GCC_INCDIR=/usr/lib/gcc/$(uname -m)-pc-linux-gnu/7.2.0/include
ln -sfv ld-linux.so.2 /lib/ld-lsb.so.3
;;
x86_64) GCC_INCDIR=/usr/lib/gcc/x86_64-pc-linux-gnu/7.2.0/include
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
Supprimez un fichier qui pourrait rester d'une construction
précédente :
rm -f /usr/include/limits.h
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 -isystem $GCC_INCDIR -isystem /usr/include" \
../configure --prefix=/usr \
--disable-werror \
--enable-kernel=3.2 \
--enable-stack-protector=strong \
libc_cv_slibdir=/lib
unset GCC_INCDIR
Voici la signification des options et des nouveaux
paramètres de configure :
-
CC="gcc -isystem
$GCC_INCDIR -isystem /usr/include"
-
Indiquer l'emplacement des répertoires d'en-têtes de gcc et
du système é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 augment la sécurité du système en ajoutant un
canari connu (un entier aléatoire) à la pile au début de
chaque fonction, et le vérifie au retour de la fonction. S'il
a changé, il y a eu un dépassement de la pile et le programme
s'arrête.
-
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. Maintenant,
testez les résultats de la construction :
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 :
-
posix/tst-getaddrinfo4
et posix/tst-getaddrinfo5 sont connus
pour échouer sur certaines architectures.
-
Les tests tst/tst-cputimer1 et rt/tst-cpuclock2 sont connus pour
échouer. La raison n'est pas complètement comprise, mais des
indications sont que des problèmes mineurs de temps peuvent
déclencher ces échecs.
-
Les tests de math échouent parfois sur des systèmes où le
processeur n'est pas un intel relativement récent ou un AMD.
-
Les tests nptl/tst-thread-affinity-{pthread,pthread2,sched}
peuvent échouer pour des raisons non encore déterminées.
-
Les autres tests connu pour échouer sur certaines
architectures sont malloc/tst-malloc-usable et
nptl/tst-cleanupx4.
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 partielle 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 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_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 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
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.26/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.26/localedata/SUPPORTED
dans le cas peu
probable où vous en auriez besoin.
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 timezone
Installez et configurez les données de timezone avec ce qui
suit :
tar -xf ../../tzdata2017b.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 -y "sh yearistype.sh" ${tz}
zic -L /dev/null -d $ZONEINFO/posix -y "sh yearistype.sh" ${tz}
zic -L leapseconds -d $ZONEINFO/right -y "sh yearistype.sh" ${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 où 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 :
cp -v /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