8.79. Nettoyage

Cette section est facultative. Si l'utilisateur ou l'utilisatrice prévu·e ne programme pas et ne prévoie pas de déboguer les logiciels du système, vous pouvez réduire la taille du système d'environ 2 Go en supprimant les symboles de débogage et les entrées inutiles de la table des symboles de débogage des binaires et des bibliothèques. Cela ne pose aucun problème en dehors du fait de ne plus pouvoir déboguer les logiciels complètement.

La plupart des gens utilisent les commandes mentionnées ci-dessous sans difficulté. Cependant, il est facile de faire une coquille et de rendre le nouveau système inutilisable, donc avant de lancer les commandes strip, il vaut mieux faire une sauvegarde du système LFS dans son état actuel.

La commande strip avec le paramètre —strip-unneeded supprime tous les symboles de débogage d'un binaire ou d'une bibliothèque. Elle supprime aussi toutes les entrées de la table des symboles qui ne sont pas requises par l'éditeur des liens (pour les binaires liés dynamiquement et les bibliothèques partagées).

Les symboles de débogage pour les bibliothèques choisies sont placés dans des fichiers séparés. Ces informations de débogage sont requises si vous lancez des tests de régression qui utilisent valgrind ou gdb plus tard dans BLFS.

Remarquez que strip remplacera le binaire ou la bibliothèque qu'il traite. Cela peut faire crasher les processus qui utilisent du code ou des données de ce fichier. Si le processus exécutant strip lui-même est affecté, le binaire ou la bibliothèque en cours de nettoyage peut être détruit. Cela peut rendre le système complètement inutilisable. Pour éviter cela, nous copierons certains bibliothèques et binaires dans /tmp, les nettoierons là, et les installerons de nouveau avec la commande install. Lisez les entrées liées dans le Section 8.2.1, « Problèmes de mise à jour » pour les raisons d'utiliser la commande install ici.

[Note]

Note

Le nom du chargeur ELF est ld-linux-x86-64.so.2 sur les systèmes 64 bits et ld-linux.so.2 sur les systèmes 32 bits. La construction ci-dessous choisit le bon nom pour l'architecture actuelle, en excluant tout ce qui fini en « g », au cas où les commandes ci-dessous ont déjà été lancées.


save_usrlib="$(cd /usr/lib; ls ld-linux*[^g])
             libc.so.6
             libthread_db.so.1
             libquadmath.so.0.0.0
             libstdc++.so.6.0.30
             libitm.so.1.0.0
             libatomic.so.1.2.0"

cd /usr/lib

for LIB in $save_usrlib; do
    objcopy --only-keep-debug $LIB $LIB.dbg
    cp $LIB /tmp/$LIB
    strip --strip-unneeded /tmp/$LIB
    objcopy --add-gnu-debuglink=$LIB.dbg /tmp/$LIB
    install -vm755 /tmp/$LIB /usr/lib
    rm /tmp/$LIB
done

online_usrbin="bash find strip"
online_usrlib="libbfd-2.39.so
               libhistory.so.8.2
               libncursesw.so.6.3
               libm.so.6
               libreadline.so.8.2
               libz.so.1.2.13
               $(cd /usr/lib; find libnss*.so* -type f)"

for BIN in $online_usrbin; do
    cp /usr/bin/$BIN /tmp/$BIN
    strip --strip-unneeded /tmp/$BIN
    install -vm755 /tmp/$BIN /usr/bin
    rm /tmp/$BIN
done

for LIB in $online_usrlib; do
    cp /usr/lib/$LIB /tmp/$LIB
    strip --strip-unneeded /tmp/$LIB
    install -vm755 /tmp/$LIB /usr/lib
    rm /tmp/$LIB
done

for i in $(find /usr/lib -type f -name \*.so* ! -name \*dbg) \
         $(find /usr/lib -type f -name \*.a)                 \
         $(find /usr/{bin,sbin,libexec} -type f); do
    case "$online_usrbin $online_usrlib $save_usrlib" in
        *$(basename $i)* )
            ;;
        * ) strip --strip-unneeded $i
            ;;
    esac
done

unset BIN LIB save_usrlib online_usrbin online_usrlib

La commande rapportera un grand nombre de fichiers comme ayant une extension non reconnue. Vous pouvez ignorer ces avertissements sans problème. Cela signifie que ces fichiers sont des scripts et non des binaires.