Gentoo Logo

Guide pour le Prelink sous Gentoo

Table des matières :

1.  Introduction

Qu'est-ce que le prelink et en quoi peut-il m'être utile ?

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. Le prelink utilise ceci à son avantage en évitant la liaison et en l'enregistrant dans l'exécutable.

Le prelink 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 prelinké.

Attention : 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é

  • Le prelink s'effectue via un programme appelé, de manière originale, prelink. Il modifie le binaire afin de lui permettre de démarrer plus rapidement.
  • Si une application prelinké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 relancer prelink sur ces bibliothèques.
  • Les modifications effectuées sur le binaire sont complètement réversibles. Prelink a 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 programme prelink est installé sur votre système.

2.  Mettre en place prelink

Installation des programmes

Vous devez d'abord installer le programme prelink. Le processus d'emerge vérifie automatiquement que votre système peut utiliser prelink en toute sécurité.

Exemple de code 2.1 : Installer prelink

# emerge 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.

Note : Astuce : Si vous obtenez une erreur essayez de compiler et de tester prelink vous-même (./configure ; make ; make test). 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 répertoires doivent être parcourus.

Exemple de code 2.2 : Exécuter env-update

# 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 traiter.

Exemple de code 2.3 : /etc/env.d/60prelink

PRELINK_PATH_MASK="/opt"

Note : Vous pouvez ajouter des répertoires dans la liste ; séparez-les par deux points « : ».

3.  Le prelink

Utilisation de prelink

J'utilise la commande suivante pour prelinker tous les binaires dans les répertoires indiqués dans /etc/prelink.conf.

Exemple de code 3.1 : Lancement de prelink

# prelink -amR

Attention : 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.

Options Explications
-a Tous (« all ») les binaires sont passés à prelink
-m Conserve l'espace de mémoire virtuelle, nécessaire si vous avez beaucoup de bibliothèques qui ont besoin d'être traitées.
-R Rend aléatoire (« random ») l'ordre d'adressage, ceci afin d'améliorer la sécurité contre les dépassements de capacité (« buffer overflows »).

Note : Pour plus d'informations et d'options, consultez man prelink.

Prelink et cron

À partir de la version sys-devel/prelink-20060213, un « cron job » est installé dans /etc/cron.daily/prelink. Pour l'activer, éditez le fichier /etc/conf.d/prelink. Ceci permet d'exécuter prelink automatiquement une fois par jour.

Accélérer le chargement de KDE après le prelink

Le temps de chargement de KDE peut être considérablement réduit après le prelink. Si vous informez KDE qu'il a été prelinké, 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élinké.

Désinstaller 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 prelink de tous les binaires :

Exemple de code 3.2 : Enlever prelink de tous les binaires

# prelink -au

Enfin, désinstallez le paquet prelink :

Exemple de code 3.3 : Désinstaller prelink

# emerge -aC prelink

4.  Problèmes connus et leurs corrections

« Cannot prelink against non-PIC shared library »

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 prelink n'accélè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 pourndes 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. Le problème provient, je pense, principalement de la liaison statique des autres bibliothèques de la GLIBC, notamment « libpthread », « libm » 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 prelink 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 :

Exemple de code 4.1 : Réparation des liens symboliques

# emerge symlinks
# symlinks -drv /

Plus de détails peuvent être trouvés sur Bugzilla ainsi que ce fil de discussion.

5.  Conclusion

Le prelink 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 le prelink 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 prelinkée. Pour faire court : Bonne chance !



Imprimer

Dernière mise à jour le 12 janvier 2010

Résumé : Ce guide explique comment utiliser le support prelink de Portage 2.0.46 et ultérieur.

Stefan Jones
Auteur

John P. Davis
Correcteur

Jorge Paulo
Correcteur

Sven Vermeulen
Correcteur

Joshua Saddler
Correcteur

Guillaume Morin
Traducteur

Camille Huot
Traducteur

Donate to support our development efforts.

Copyright 2001-2013 Gentoo Foundation, Inc. Questions, Comments? Contact us.