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"
The cause of this problem is from badly compiled shared libraries that were compiled without the -fPIC gcc option for all their object files.

Here are the libraries that haven't been fixed or cannot be fixed:


 * The libraries in the wine package, including winex. Prelinking wouldn't speed up MS Windows executables anyway.
 * The library in media-video/mjpegtools,.
 * Nvidia OpenGl libraries, . Due to performance reasons they were compiled without PIC support.

If your problem library was not listed please report it with, preferably, a patch to add  to the relevant CFLAGS.

When I prelink my system some static binaries don't work anymore
Where glibc is concerned, there is no such thing as a 100% static binary. If you statically compile a binary with glibc, it may still depend on other system files. Below is an explanation by Dick Howell,

"I suppose the idea is that everything will be in the downloaded file, so nothing depends on the local libraries on the target system. Unfortunately with Linux, and I think anything else using GLIBC, this still isn't quite true. There's this "libnss" (name service switch, some people seem to call it network security system) which provides functions for accessing various databases for authentication, network information, and other things. It's supposed to make application programs independent of the separately configured actual network environment of the machine. A nice idea, but changes to GLIBC can lead to problems loading it. And you can't statically link "libnss", since it is configured for each machine individually. The problem comes, I think, mainly from statically linking other GLIBC libraries, notably "libpthread", "libm", and "libc", from which come incompatible calls to "libnss" functions."

Prelink aborts with "prelink: dso.c:306: fdopen_dso: Assertion `j
k' failed." ===

This a known problem, kindly diagnosed here. Prelink cannot cope with UPX-compressed executables. As of prelink-20021213 there is no fix except to hide the executables while you are prelinking. See the section above for an easy way to do this.

I use grsecurity and it seems that prelinking doesn't work.
In order to prelink on a system with grsecurity using a randomized mmap base, it is necessary to turn "randomized mmap base" OFF for. This can be done with the  utility, but it must be done when the file is not in use (f.i. boot from a rescue CD).

Prelink fails with error "prelink: Can't walk directory tree XXXX: Too many levels of symbolic links"
Your symlinks are nested too deeply. This happens when a symlink points to itself. For example, is the most common. To fix this, you can find the symlink manually or use the utility provided by the  package:

More details can be found at Bugzilla and this forum post.

Conclusion
Prelinking can drastically speed up the start up times for a number of large applications. Support is built into Portage. Prelinking is also safe as you can always undo the prelinking for any binary if you come across any problems. Just remember that when you update glibc or other libraries that you prelinked with, you need to rerun ! In short good luck!

Acknowledgements
We would like to thank the following authors and editors for their contributions to this guide:


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