ELF (Executable and Linking Format) est un format binaire
développé à l'origine par USL (UNIX System Laboratories) et
utilisé actuellement par Solaris et System VR4. En raison de sa grande
souplesse comparé au vieux format a.out
que Linux utilisait
jusqu'à présent, les développeurs de GCC et de la bibliothèque C ont
décidé l'année dernière (1994) que ELF deviendrait également le format
standard des exécutables binaires de Linux.
Les avantages de ce format se manifestent essentiellement de deux façons pour le programmeur :
-fPIC
, puis de faire l'édition de liens par
une commande comme :
gcc -shared -Wl,-soname,lib_toto.so.y -o lib_toto.so.y.x *.o
Cela peut vous paraître compliqué, mais c'est pourtant bien plus
simple que la méthode de création de bibliothèques partagées au format
a.out
, qui nécessitait de prévoir de l'espace pour toutes les
données que vous pensiez un jour incorporer dans de futures versions
de la bibliothèque, et d'enregistrer cet espace d'adressage auprès
d'un responsable (la procédure est décrite dans un document de plus de
20 pages, consultez-le
ftp://tsx-11.mit.edu/pub/linux/packages/GCC/src/tools-2.16.tar.gz
pour plus de détails.
Malgré ces avantages, nous devons dire que ELF peut
éventuellement être un peu plus lent. Dans le pire des cas,
ce ralentissement est de l'ordre de 1% à 5%, bien qu'à notre
connaissance les tests effectués jusqu'à présent montrent que la
différence est suffisamment faible pour passer inaperçue vis-à-vis
de tous les autres événements se produisant au même instant. Si
vous pouvez visualiser ou imprimer des documents TeX ou PostScript,
jetez un coup d'oeil au fichier speed.comp-1.0.tar.gz
, disponible
sur les sites diffusant Linux.
Ce ralentissement provient du fait que le code de la bibliothèque ELF
doit être à une position totalement indépendante (c'est ce qui est
réalisé par l'option -fPIC
citée plus haut), et qu'il faut
alors dédier un registre au stockage de cette adresse.
Il reste donc un registre de moins pour les variables, et comme
les processeurs Intel ont un nombre de registre d'usage général
extrêmement limité, ceci explique cela.
Beaucoup se font de fausses idées sur ce qu'ELF apportera à leur système :
Bien que ce soit la même "enveloppe" qu'utilisent les systèmes SVR4, cela ne signifie pas que les programmes SVR4 vont soudainement devenir exécutables sous Linux. C'est comme le format des disques : vous pouvez stocker des programmes Linux sur des disquettes MS-DOS ou Minix, et vice versa, mais en aucun cas cela signifie que ces systèmes seront capables de faire fonctionner ces programmes.
Il est théoriquement possible d'exécuter des applications prévues pour d'autres Unix pour processeurs x86 sous Linux, mais ce présent document ne contient pas les instructions nécessaires. Commencez par examiner le module iBCS (disponible sur les sites miroir) pour savoir s'il correspond à vos besoins.
Vous aboutirez peut-être à des binaires plus petits, toutefois,
puisqu'il est plus facile de créer des bibliothèques partagées de code
utilisé couramment entre de nombreux programmes. En général, si vous
utilisez les mêmes options de compilation et que le résultat est moins
grand que la version a.out
, c'est surtout dû à une version
différente du compilateur. "Plus rapide", cela nous étonnerait
beaucoup. Une augmentation de vitesse peut être dûe à la réduction de
la taille du programme, utilisant moins de swap ou dont les zones
s'intègrent mieux dans le cache, mais pas au format ELF en lui-même.
À l'issue de cette procédure de migration, vous aurez un
système capable de compiler et d'exécuter aussi bien du format ELF que
du a.out
. Par défaut, toute compilation générera du ELF, mais
une simple option sur la ligne de commandes permet la création de
a.out
. Il y a, bien entendu, un inconvénient à posséder un
système mixte, comprenant des binaires aux deux formats : si vous avez
une bonne quantité de programmes des deux types en fonctionnement au
même moment, vous aurez alors deux copies de la bibliothèque C
en mémoire. Néanmoins, il a été constaté que la dégradation de
performances est indétectable sur une machine équipée de seulement 6
Mo de RAM, aussi vous n'avez rien à craindre. Vous gâchez bien plus de
mémoire tous les jours en utilisant des pavés comme Emacs et les
binaires statiques de Mosaic ou NetScape :-)
Ou du moins, pas dans ce contexte.
Il y a essentiellement deux raisons de sauter le pas : la première, c'est la souplesse de programmation accrue que nous avons indiqué plus haut. La seconde, c'est qu'en raison de la première, tout les autres vont le faire. Les versions à venir de GCC et de la bibliothèque C ne seront plus fournies que pour ELF, et les autres développeurs vont suivre le mouvement.
Par esprit de contradiction, on peut dire qu'il y a aussi deux raisons de ne pas convertir son système en ELF, pour l'instant. La première, c'est que les choses sont encore en évolution, certaines applications (dont la série des noyaux "stables" 1.2) nécessitent des patches afin de pouvoir se compiler en ELF, et il peut rester quelques bogues ; certains argueront qu'ils attendent que Linus lui-même ait converti son système, par exemple.
La seconde, c'est que bien que la procédure d'installation décrite
dans ce document soit simple et rapide (il suffit au grand maximum
d'une petite heure, si l'on ne compte pas le temps de téléchargement
des fichiers nécessaires), la moindre erreur à n'importe quel stade
vous laissera un système incapable de fonctionner. Si vous n'avez pas
l'habitude des mises à jour des bibliothèques partagées, et si les
commandes ldconfig
et ldd
n'évoquent rien pour vous,
il sera sans doute plus raisonnable que vous attendiez pour vous
procurer une distribution complète de Linux en ELF. Vous pourrez alors
sauvegarder votre installation et restaurer sélectivement ce dont vous
aurez besoin, avec cette nouvelle version. Ensuite, vous reprendrez la
lecture de ce document car vous aurez sans doute envie d'expérimenter
et d'en apprendre un peu plus sur ce format.
Vous êtes toujours là ?
Chapitre Suivant , Chapitre Précédent
Table des matières de ce chapitre, Table des matières générale
Début du document, Début de ce chapitre