- A.out
-
a.out
a.out (de assembler output) est un ancien format de fichier utilisé dans les premières versions d'Unix. Il était utilisé pour les fichiers exécutables, les codes object et, plus tard, les librairies partagées.À l'heure actuelle, a.out reste le nom de fichier utilisé par défaut chez certains compilateurs et linkers quand aucun nom de fichier de sortie n'est précisé, et ce même si cet exécutable n'est pas au format a.out.[1].
Sommaire
Utilisation
Un format a.out pour PDP-7, similaire à celui employé sur PDP-11, apparait sur la première édition d'Unix [2]. Il a été supplanté par le format COFF (en) dans AT&T Unix System V qui a été supplanté à son tour par le format ELF dans System V Release 4.
Bien que Berkeley Unix ait continué à l'utiliser, les systèmes BSD modernes ont depuis migré vers ELF: NetBSD a changé avec sa version 1.5 et FreeBSD pendant la transition entre sa version 2.2 et 3.0.
Le format a.out n'a pas de support direct des symboles de débugage mais il peut être utilisé avec stabs (en) qui utilise des entrées de table de symbole spécifiques pour stocker les données.
Le noyau Linux utilisait aussi a.out jusque sa version 1.2 (le support de ELF en expérimental a été ajouté à la version 1.1.52) où il a été remplacé par ELF[3]. Cette transition a été plus ou moins due au fait qu'il était difficile de faire des librairies partagées avec ce genre de format qui nécessitait par exemple de devoir enregistrer l'adresse virtuelle à laquelle la librairie était chargée en mémoire pour que le ld.so (en) de Linux puisse retrouver la librairie partagée[4].
Plusieurs versions de BSD ont pu conserver ce format plus longtemps que Linux principalement parce que l'implémentation du a.out des BSD était plus flexible[5].
Le format
Il existe plusieurs variantes aux exécutables a.out: OMAGIC, NMAGIC, QMAGIC ou ZMAGIC.
- Le format OMAGIC a un segment contigüe après l'en-tête: le segment de texte et de données ne sont pas séparés.
- Le format NMAGIC est comme le OMAGIC mise à part que le segment de données est chargé dans la page suivant la dernière page du segment de texte qui, lui, est en lecture seule.
- Le format ZMAGIC ajoute le support du pagination à la demande (en) (les pages mémoire ne sont que lorsqu'elles sont nécessaires; on parle alors de « Lazy loading »).
- Le format QMAGIC permet à l'en-tête d'être dans la même page que le début du segment texte, permettant ainsi d'économiser une page mémoire. Les binaires QMAGIC sont généralement chargés une page avant la fin de l'espace d'adressage virtuel, permettant ainsi d'éviter la référence à un pointeur null lors d'une erreur de segmentation.
Structure
Un fichier a.out est découpé en sept sections; les voici dans l'ordre:
- en-tête exec (« exec header »)
- contient les paramètres utilisés par le noyau pour charger et exécuter le binaire, ainsi que les paramètres utilisés par l'éditeur de liens (ld) pour lier l'exécutable à d'autres. C'est la seule section obligatoire.
- segment de texte (« text segment »)
- contient le code machine et les données qui devront être chargé en mémoire quand le programme devra s'exécuter. Il peut être chargé dans une zone mémoire en lecture seule.
- segment de données (« data segment »)
- contient les données initialisées par le programme lui-même. Il est toujours chargé dans un segment mémoire qui est accessible en écriture.
- réallocation de texte (« text relocations »)
- contient des enregistrement utilisé par l'éditeur de liens pour mettre à jour les pointeurs du segment de texte quand plusieurs exécutables sont liés.
- réallocation de données (« data relocations »)
- comme dans la partie réallocation de texte, mais pour le segment de données.
- table de symboles (« symbol table »)
- table utilisée par l'éditeur de liens pour retrouver l'adresse des variables nommées ou des fonctions (symboles) entre différents binaires.
- table de chaîne (« string table »)
- contient le nom associé à un symbole.
Notes et références
- ↑ (en) Rupert Wood, « 'What to do with a.out' - sur la mailinglist gcc-help », 8 avril 2002. Consulté le 2 juin 2008
- ↑ (en) [pdf] a.out — assembler and link editor output, 3 novembre 1971, Bell Labs. Consulté le 2 juin 2008
- ↑ (en) Daniel Barlow, « The Linux ELF HOWTO (v1.29) », 14 juillet 1996. Consulté le 2 juin 2008
- ↑ (en) [pdf] Ulrich Drepper, « How To Write Shared Libraries - 1.1 A Little Bit of History », 20 août 2006. Consulté le 2 juin 2008. « When introducing shared libraries certain design decisions had to be made to work in the limitations of a.out. (...) For all these reasons and more, Linux converted early on to using ELF (Executable Linkage Format) as the binary format. »
- ↑ (en) BSD Myths: BSD uses the a.out executable format, which is outdated technology. Consulté le 2 juin 2008
(en) Cet article est partiellement ou en totalité issu d’une traduction de l’article en anglais intitulé « A.out ».
Voir aussi
Liens externes
- Portail de la programmation informatique
Catégorie : Format de données numériques
Wikimedia Foundation. 2010.