Important: You are required to change your passwords used for Gentoo services and set an email address for your Wiki account if you haven't done so. See the full announcement and Wiki email policy change for more information.

Prelink

From Gentoo Wiki
Revision as of 06:46, 20 September 2013 by Jaaf (Talk | contribs)

Jump to: navigation, search
Other languages:English 100% • ‎français 100%

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

Warning
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 relancer prelink 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 programme prelink 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.

Note
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.

Code/etc/env.d/60prelink

PRELINK_PATH_MASK="/opt"
Note
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
Warning
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.
Note
Pour plus d'informations et d'options, consultez man prelink .

Tâches de cron et Prelink

À partir de la version sys-devel/prelink-20060213, une tâche de cronest installée 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 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

"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 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 Bugzilla 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 !

Remerciements

Nous tenons à remercier les auteurs et éditeurs suivants pour leur contribution à ce guide :


  • Stefan Jones
  • John P. Davis
  • Jorge Paulo
  • Sven Vermeulen
  • Erwin
  • nightmorph