A.out - Définition

Source: Wikipédia sous licence CC-BY-SA 3.0.
La liste des auteurs de cet article est disponible ici.

Introduction

a.out (de assembler output) est un 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é, même si cet exécutable n'est pas au format a.out.

Utilisation

Un format a.out pour PDP-7, similaire à celui employé sur PDP-11, apparaît sur la première édition d'Unix. 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. 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 connaître la nouvelle adresse de la librairie partagée.

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. MINIX_3 (en) utilise toujours a.out comme format de fichier binaire mais il ne supporte pas les librairies partagées.

Le format

Il existe plusieurs variantes aux exécutables a.out: OMAGIC, NMAGIC, QMAGIC ou ZMAGIC.

  • Le format OMAGIC a des segments contiguës après l'en-tête: le segment de texte et de données ne sont pas séparés. Ce format était aussi utilisé pour les fichiers objets.
  • Le format NMAGIC est comme le OMAGIC mise à part que le segment de données est chargé dans la page suivant la fin du segment de texte qui, lui, est en lecture seule.
  • Le format ZMAGIC ajoute le support de la pagination à la demande (en) (les pages mémoire ne sont chargées que lorsqu'elles sont nécessaires; on parle alors de « Lazy loading »). La taille des segments code et données doit être un multiple de la taille de page.
  • 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'intercepter les références à 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.
Page générée en 0.098 seconde(s) - site hébergé chez Contabo
Ce site fait l'objet d'une déclaration à la CNIL sous le numéro de dossier 1037632
A propos - Informations légales
Version anglaise | Version allemande | Version espagnole | Version portugaise