Prelink/fr

Ce guide vous explique comment utiliser  dans Portage 2.0.46 et postérieur.

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  chaque fois qu'une bibliothèque est mise à jour pour un exécutable pré-lié.

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  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   sur ces bibliothèques.
 * Les modifications effectuées sur le binaire sont complètement réversibles.  dispose d'une fonction d'annulation.
 * Les versions récentes de Portage peuvent gérer, via, les changements de MD5sum et mtime des binaires.
 * Il n'est pas nécessaire de définir FEATURES="prelink" dans le fichier, car Portage utilise  automatiquement quand le programme   est installé sur votre système.

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

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.

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  génère le fichier  qui indique à   quels fichiers  doivent être pré-liés.

Malheureusement vous ne pourrez pas passer à  les fichiers qui ont été compilés par d'anciennes versions de. La plupart de ces applications proviennent de paquets binaires pré-compilés qui sont installés dans. Créer le fichier suivant indiquera à  de ne pas essayer de les pré-lier.

/etc/env.d/60prelink

Utiliser Prelink
J'utilise la commande suivante pour pré-lier tous les binaires dans les répertoires indiqués dans.

Tâches de cron et Prelink
À partir de la version, une tâche de cronest installée dans. Pour l'activer, éditez le fichier. Ceci permet d'exécuter  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  (car il n'est plus requis à présent) et cela accélérera KDE encore plus.

Mettez  dans   pour informer KDE qu'il a été pré-lié.

Retirer prelink
S'il vous venait l'envie de supprimer  de votre système, vous devrez d'abord supprimer la tâche planifiée dans  puis le fichier. Ensuite, vous devrez retirer le pré-lien de tous les binaires :

Enfin, désinstallez le paquet  lui-même.

"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,.
 * Les bibliothèques OpenGL de Nvidia 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. Pour ce faire, vous devez utiliser l'utilitaire, 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, 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   :

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 !