Prelink
La version upstream de glibc a supprimé le support de prelink dans glibc-2.35, donc le support pour le pre-linkage ne peut pas être conservé. Le paquet sys-devel/prelink présenté ci après n'est plus disponible dans le répertoire ebuild de gentoo depuis le 23 février 2022. Voir bug #579374 ou bug #726062 Pour les détails.
Ce guide vous explique comment utiliser prelink
dans Portage 2.0.46 et postérieur.
Introduction
Qu'est-ce que Prelink et que peut-il faire pour moi ?
La plupart des applications utilisent des bibliothèques partagées (shared libraries ). Ces bibliothèques partagées ont besoin d'être chargées en mémoire lors de l'exécution de l'application et les références aux différents symboles doivent être résolues. Pour la plupart des petits programmes, cette liaison dynamique est très rapide. Mais pour les programmes écrits en C++ qui ont beaucoup de dépendances, la liaison dynamique peut prendre un temps considérable.
Sur la plupart des systèmes, les bibliothèques ne changent pas souvent et quand un programme est en cours d'exécution l'opération de liaison est toujours la même. Prelink utilise ceci à son avantage en établissant la liaison et en l'enregistrant dans l'exécutable, dans les fait en le pré-liant.
Le pré-lien peut raccourcir le temps de démarrage des applications. Par exemple, le temps de chargement d'un programme KDE normal peut être réduit de plus de 50%. La seule opération de maintenance nécessaire est de ré-exécuter prelink
chaque fois qu'une bibliothèque est mise à jour pour un exécutable pré-lié.
Prelink ne fonctionne pas avec la version sécurisée Hardened de Gentoo parce que les deux systèmes essaient de modifier les adresses des bibliothèques partagées. L'option -R de prelink offre un certain niveau de sécurité en utilisant des adresses aléatoires.
Résumé
- La pré-liaison s'effectue via un programme appelé, de manière originale, . Il modifie le binaire afin de lui permettre de démarrer plus rapidement.
- Si une application pré-liée voit une de ses bibliothèques modifiée (mise à jour), alors il faut relancer
prelink
sur l'application, dans le cas contraire vous n'obtiendrez aucune amélioration de vitesse. En fait, à chaque fois que vous mettez à jour, via Portage, un paquet qui met à jour des bibliothèques, vous devez relancerprelink
sur ces bibliothèques. - Les modifications effectuées sur le binaire sont complètement réversibles.
prelink
dispose d'une fonction d'annulation. - Les versions récentes de Portage peuvent gérer, via
prelink
, les changements de MD5sum et mtime des binaires. - Il n'est pas nécessaire de définir FEATURES="prelink" dans le fichier make.conf, car Portage utilise
prelink
automatiquement quand le programmeprelink
est installé sur votre système.
Configurer Prelink
Installer les programmes
Vous devez d'abord installer le programme prelink
. Le processus emerge vérifie automatiquement que votre système peut utiliser prelink
en toute sécurité.
root #
emerge --ask prelink
Un certain nombre de personnes ont obtenu des erreurs lors de l'installation parce que des tests ont échoué. Ces tests ont été mis en place pour des raisons de sécurité ; le comportement de prelink est incertain si vous les désactivez. Les erreurs d'emerge proviennent habituellement des paquets de base : binutils, gcc et glibc. Essayez de réinstaller ces paquets dans cet ordre.
Astuce : Si vous obtenez une erreur essayez de compiler et de tester
prelink
vous-même ( ./configure
; make
; make check
). En cas d'échec, vous pouvez consulter les fichiers *.log dans le répertoire testsuite. Ils peuvent vous procurer quelques indices utiles.Si vous avez repéré un ensemble d'étapes qui reproduisent une erreur d'emerge même sur un autre système, veuillez vérifier si le problème n'a pas déjà été signalé sur Bugzilla , et créez un nouveau bug si besoin.
Préparer votre système
Veuillez aussi vérifier que l'option de compilation -fPIC n'est pas définie dans les variables CFLAGS et CXXFLAGS. Si vous avez utilisé cette option, vous devrez recompiler tout votre système sans elle
Configuration
La commande env-update
génère le fichier /etc/prelink.conf qui indique à prelink
quels fichiers doivent être pré-liés.
root #
env-update
Malheureusement vous ne pourrez pas passer à prelink
les fichiers qui ont été compilés par d'anciennes versions de binutils
. La plupart de ces applications proviennent de paquets binaires pré-compilés qui sont installés dans /opt . Créer le fichier suivant indiquera à prelink
de ne pas essayer de les pré-lier.
PRELINK_PATH_MASK="/opt"
Vous pouvez ajouter des répertoires dans la liste ; séparez-les par deux points : .
L'opération de pré-liage
Utiliser Prelink
J'utilise la commande suivante pour pré-lier tous les binaires dans les répertoires indiqués dans /etc/prelink.conf.
root #
prelink -amR
Si l'espace disque disponible est limité
prelink
risque de tronquer vos binaires si vous traitez l'intégralité de votre système, ce qui rendra votre système inutilisable. Utilisez les commandes file
ou readelf
afin de vérifier l'état d'un fichier binaire. Vous pouvez également vérifier l'espace libre de vos disques avant de lancer prelink
avec df -h
.Explication sur les options : | |
---|---|
-a | "All": pré-lie tous les binaires |
-m | Conserve l'espace de mémoire virtuelle. Ceci est nécessaire si vous avez beaucoup de bibliothèques qui ont besoin d'être pré-liées. |
-R | Random -- rend aléatoire l'ordre des adresses pour améliorer la sécurité contre les débordements de mémoire tampon. |
Pour plus d'informations et d'options, consultez
man prelink
.Tâches de cron et Prelink
sys-devel/prelink
installe une tâche cron dans /etc/cron.daily/prelink . Pour l'activer, éditez le fichier de configuration /etc/conf.d/prelink . Ceci permet d'exécuter prelink
automatiquement une fois par jour en arrière-plan sans que vous ayez à exécuter la commande à la main.
Accélérer le chargement de KDE après la pré-liaison
Le temps de chargement de KDE peut être considérablement réduit après la pré-liaison. Si vous informez KDE qu'il a été pré-lié, il désactivera le chargement de kdeinit
(car il n'est plus requis à présent) et cela accélérera KDE encore plus.
Mettez KDE_IS_PRELINKED=1
dans /etc/env.d/*kdepaths* pour informer KDE qu'il a été pré-lié.
Retirer prelink
S'il vous venait l'envie de supprimer prelink
de votre système, vous devrez d'abord supprimer la tâche planifiée dans /etc/cron.daily puis le fichier /etc/conf.d/prelink. Ensuite, vous devrez retirer le pré-lien de tous les binaires :
root #
prelink -au
Enfin, désinstallez le paquet prelink
lui-même.
root #
emerge -c prelink
Problèmes connus et leur correction
La cause de ce problème provient de bibliothèques partagées qui ont été mal compilées, sans l'option -fPIC de gcc pour tous leurs fichiers objets.
Voici les bibliothèques qui n'ont pas encore été corrigées ou qui ne peuvent l'être :
- Les bibliothèques du paquet wine, ainsi que winex. Le pré-liage n'accellèrerait pas les exécutables MS Windows de toute manière.
- La bibliothèque dans media-video/mjpegtools, /usr/lib/liblavfile-1.6.so.0.
- Les bibliothèques OpenGL de Nvidia ( /usr/lib/opengl/nvidia/lib/libGL.so.*) ont été compilées sans le support PIC pour des raisons de performance.
Si votre bibliothèque problématique n'est pas présente dans la liste, nous vous prions de nous le rapporter avec, de préférence, un correctif pour ajouter -fPIC au CFLAGS approprié.
Quand je traite mon système, quelques binaires statiques ne fonctionnent plus
Dans le cas de la glibc, il n'y a pas de tels binaires 100% statiques. Si vous compilez statiquement un binaire avec la glibc, il peut toujours rester dépendant d'autres fichiers du système. Ci-dessous vous trouverez une explication de Dick Howell :
« Je suppose que tout se trouve dans le fichier téléchargé, et donc que rien ne dépendra des bibliothèques locales sur le système cible. Malheureusement avec Linux, et, je pense, avec quoi que ce soit d'autre utilisant la GLIBC, ce n'est plus tout à fait vrai. Prenons libnss (« Sélecteur de Service de Nom », certains semblent appeler ça « Système de Sécurité Réseau ») qui procure des fonctions permettant l'utilisation de diverses bases de données pour l'authentification, les informations sur le réseau et autres. C'est supposé rendre les programmes indépendants de l'environnement réseau actuel de la machine, configuré séparément. Bonne idée, mais les changements de la GLIBC peuvent entraîner des problèmes lors de son chargement. Et vous ne pouvez pas lier statiquement libnss, car elle est configurée indépendamment pour chaque machine. Je pense que le problème provient principalement de la liaison statique des autres bibliothèques de la GLIBC, notamment libpthread, ibm et libc desquelles proviennent des appels aux fonctions de libnss incompatibles. »
Prelink échoue avec l'erreur « prelink: dso.c:306: fdopen_dso: Assertion 'j == k' failed. »
C'est un problème connu, diagnostiqué ici. Prelink ne gère pas les exécutables compressés avec UPX. Jusqu'à prelink-20021213, il n'existe pas d'autre méthode que de cacher les exécutables concernés au moment du prelink. Lisez la section Configuration ci-dessus pour savoir comment faire cela facilement.
J'utilise grsecurity et il semble que le pré-liage ne fonctionne pas
Pour faire marcher prelink sur un système sous grsecurity qui utilise une base mmap() aléatoire, il est nécessaire de désactiver « randomized mmap() base » pour les fichiers /lib/ld-2.3.*.so . Pour ce faire, vous devez utiliser l'utilitaire chpax
, mais vous devez le faire sans que le fichier ne soit utilisé (par exemple démarrez sur un LiveCD).
Prelink échoue avec l'erreur "prelink: Can't walk directory tree XXXX: Too many levels of symbolic links"
Vos liens symboliques sont entremêlés trop profondément. Cela arrive quand un lien symbolique pointe vers lui-même. Par exemple, /usr/lib/lib -> lib est le plus fréquent. Pour y remédier, vous pouvez trouver le lien symbolique à la main, ou bien utiliser l'utilitaire fourni dans le paquet symlinks
:
root #
emerge symlinks
root #
symlinks -drv /
Plus de détails peuvent être trouvés sur bug #82117 ainsi que ce fil de discussion .
Conclusion
Le pré-liage peut considérablement réduire le temps de démarrage d'un bon nombre de grosses applications. Portage le gère très bien. C'est aussi sans danger puisque vous pouvez annuler la pré-liaison d'un quelconque binaire si vous rencontrez un problème. Rappelez-vous juste qu'il faut relancer prelink à chaque fois que vous mettez à jour la glib ou une autre bibliothèque pré-liée. Pour faire court : Bonne chance !
This page is based on a document formerly found on our main website gentoo.org.
The following people contributed to the original document: Stefan Jones, John P. Davis, Jorge Paulo, Erwin, nightmorph
They are listed here because wiki history does not allow for any external attribution. If you edit the wiki article, please do not add yourself here; your contributions are recorded on each article's associated history page.