Afin de comprendre pourquoi FreeBSD utilise le format elf(5), vous devez d'abord connaître quelques détails concernant les trois formats “dominants” d'exécutables actuellement en vigueur sous UNIX®:
Le plus vieux et le format objet “classique” d'UNIX®. Il utilise une entête courte et compacte avec un nombre magique au début qui est souvent utilisé pour caractériser le format (voir la page de manuel a.out(5) pour plus de détails). Il contient trois segments chargés: .text, .data, et .bss plus une table de symboles et une table de chaînes de caractères.
COFF
Le format objet SVR3. L'entête comprend une table de section, de telle sorte que vous avez plus de sections qu'uniquement .text, .data et .bss.
Le successeur de COFF, qui permet des sections multiples et des valeurs possibles de 32 bits et 64 bits. Un inconvénient majeur: ELF a aussi été conçu en supposant qu'il y aurait qu'un seul ABI par architecture système. Cette hypothèse est en fait assez incorrecte, et même dans le monde SYSV (qui a au moins trois ABIs: SVR4, Solaris, SCO) cela ne se vérifie pas.
FreeBSD essaye de contourner ce problème en fournissant un utilitaire pour marquer un exécutable connu ELF avec des informations sur l'ABI qui va avec. Consultez la page de manuel de brandelf(1) pour plus d'informations.
FreeBSD vient du camp “classique” et a
utilisé le format a.out(5), une technologie
employée et éprouvée à travers des
générations de BSDs, jusqu'aux débuts de la
branche 3.X. Bien qu'il fut possible de compiler et
d'exécuter des binaires natifs ELF (et
noyaux) sous FreeBSD avant cela, FreeBSD a initialement
résisté à la “pression” de passer
à ELF comme format par défaut.
Pourquoi? Bien, quand le camp Linux ont fait leur
pénible transition vers ELF, ce n'est pas
tant fuir le format a.out
qui rendait
difficile la construction de bibliothèques partagée
pour les développeurs mais le mécanisme de
bibliothèques partagées basé sur des tables de
sauts inflexible. Puisque les outils ELF
disponibles offraient une solution au problème
des bibliothèques partagées et étaient
perçus comme “le chemin à suivre” de toute
façon, le coût de la migration a été
accepté comme nécessaire, et la transition a
été réalisée. Le mécanisme FreeBSD
de bibliothèques partagées se rapproche plus
du style de mécanisme de bibliothèques
partagées de SunOS™ de Sun, et est très simple
à utiliser.
Pourquoi existe-t-il tant de formats différents?
Dans un obscure et lointain passé, il y avait du
matériel simple. Ce matériel simple supportait
un simple petit système. a.out
était complètement adapté pour
représenter les binaires sur ce système simple
(un PDP-11). Au fur et à mesure que des personnes
portaient UNIX® à partir de ce système
simple, ils ont maintenus le format a.out
parce qu'il était suffisant pour les premiers portages
d'UNIX® sur des architectures comme le Motorola 68k, les VAX,
etc.
Alors un certain ingénieur matériel brillant
a décidé qu'il pourrait forcer le matériel
à faire des choses bizarre, l'autorisant ainsi à
réduire le nombre de portes logiques et permettant
au coeur du CPU de fonctionner plus rapidement.
Bien qu'on l'a fait fonctionner avec ce nouveau
type de matériel (connu de nos jour sous le nom de
RISC), a.out
n'était pas adapté
à ce matériel, aussi beaucoup de formats ont
été développés
pour obtenir de meilleures performances de ce matériel
que ce que pouvait offrir le simple et limité format
qu'était a.out
. Des
choses comme COFF, ECOFF,
et quelques autres obscures formats ont été
inventé et leur limites explorées avant que les choses
ne se fixent sur ELF.
En outre, les tailles des programmes devenaient
énormes alors que les disques (et la mémoire
physique) étaient toujours relativement
petits, aussi le concept de bibliothèque partagée
est né. Le système de VM (mémoire virtuelle)
est également devenu plus sophistiqué.
Tandis que chacune de ces avancées était
faites en utilisant le format a.out
,
son utilité a été élargie
de plus en plus avec chaque nouvelle fonction. De plus les
gens ont voulu charger dynamiquement des choses à
l'exécution, ou se débarrasser de partie de
leur programme après l'initialisation pour économiser
de l'espace mémoire et de pagination. Les langages
sont devenus plus sophistiqués et les gens ont voulu
du code appelé automatiquement avant la partie
principale du programme. Beaucoup de modifications ont
été apportées au format a.out
pour rendre possible toutes ces choses, et cela a
fonctionné pendant un certain temps. Avec le temps,
a.out
n'était plus capable de
gérer tous ces problèmes sans une augmentation
toujours croissante du code et de sa complexité.
Tandis ELF résolvait plusieurs de
ces problèmes, il aurait été pénible
de quitter un système qui a fonctionné.
Ainsi ELF a dû attendre jusqu'au moment
où il était plus pénible de rester avec
a.out
que d'émigrer vers
ELF.
Cependant, avec le temps, les outils de compilation desquels ceux de FreeBSD sont dérivés (l'assembleur et le chargeur tout spécialement) ont évolué en parallèle. Les développeurs FreeBSD ajoutèrent les bibliothèques partagées et corrigèrent quelques bogues. Les gens de chez GNU qui ont à l'origine écrit ces programmes, les récrivirent et ajoutèrent un support plus simple pour la compilation multi-plateformes, avec différents formats à volonté, et ainsi de suite. Lorsque beaucoup de personnes ont voulu élaborer des compilateurs multi-plateformes pour FreeBSD, elles n'eurent pas beaucoup de chance puisque les anciennes sources que FreeBSD avait pour as et ld n'étaient pas adaptées à cette tâche. Le nouvel ensemble d'outils de GNU (binutils) supporte la compilation multi-plateformes, ELF, les bibliothèques partagées, les extensions C++, etc. De plus, de nombreux vendeurs de logiciels fournissent des binaires ELF, et c'est une bonne chose pour permettre leur exécution sous FreeBSD.
ELF est plus expressif
qu'a.out
et permet plus d'extensibilité
dans le système de base.
Les outils ELF sont mieux maintenus, et
offrent un support pour la compilation multi-plateformes, ce qui
est important pour de nombreuses personnes.
ELF peut être légèrement plus lent
qu'a.out
, mais tenter de mesurer cette
différence n'est pas aisé. Il y a
également de nombreux détails qui
diffèrent entre les deux dans la façon dont
ils mappent les pages mémoire, gère le code
d'initialisation, etc.
Dans le futur, le support a.out
sera
retiré du noyau GENERIC
, et
par la suite retiré des sources du noyau une fois que le
besoin d'exécuter d'anciens programmes
a.out
aura disparu.
Ce document, ainsi que d'autres peut être téléchargé sur ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/
Pour toutes questions à propos de FreeBSD, lisez la
documentation avant de contacter
<questions@FreeBSD.org>.
Pour les questions sur cette documentation, contactez
<doc@FreeBSD.org>.