Linux Embedded

Le blog des technologies libres et embarquées

Accélérez votre système avec prelink

Lorsque vous lancez un programme lié à des bibliothèques partagées, celui-ci passe nécessairement par la phase dite de recherche des symboles (symbol lookup). Cela consiste, pour chaque bibliothèque chargée, à chercher où se trouvent les fonctions dont le programme a besoin.

Prenons l'exemple d'OpenOffice. Sur mon système, le binaire soffice.bin est lié à 46 bibliothèques ! La recherche des symboles est dans ce cas une tâche lourde qui ralentit sensiblement le chargement du programme. Cela dépend bien sur de la puissance de votre système. Lorsque Jakub Jel'nek, le créateur du projet prelink chez RedHat, a prelinké OpenOffice en 2004 sur un Pentium III, il a gagné plus de 4 secondes au démarrage ! Sur un système moderne (Core 2 Duo), le gain est inférieur à une seconde (encore que ce test ne soit pas vraiment fiable puisque OpenOffice a subi de nombreuses optimisations depuis 2004).

Que fait le prelinker ? Il effectue la recherche des symboles et va directement stocker l'adresse de chacun d'entre eux directement dans l'exécutable. Cela est possible grâce à la grande flexibilité du format ELF utilisé par Linux depuis 1995.

Le chargement des bibliothèques partagées est donc accéléré, mais au prix de la flexibilité : si vous mettez à jour un bibliothèque, vous devrez aussi re-prelinker tous les programmes qui en dépendent. C'est la raison pour laquelle les distributions Linux ne prelinkent pas leurs binaires. Le fonctionnement de prelink est en réalité bien plus complexe que ce que je viens d'exposer. Si son fonctionnement vous intéresse, je vous invite à consulter l'étude de Jakub sur le sujet.

L'utilisation de prelink peut faire toute la différence sur un système embarqué. En 2005, Panasonic avait présenté les résultats de l'utilisation de prelink sur un téléphone mobile basé sur un processeur ARM9. Le temps de démarrage est passé de 2479 ms à 125 ms.

Prelink est disponible pour les architectures alpha, arm, cris, i386, ia64, mips, ppc32, ppc64, s390, sh, sparc32, sparc64 et x86_64. Il ne fonctionne qu'avec la glibc. uClibc n'est malheureusement pas supportée.

Un tutoriel intéressant sur prelink chez Gentoo : http://www.gentoo.org/doc/en/prelink-howto.xml

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée.