# A.out

a.out es un formato de archivo usado en versiones antiguas de sistemas operativos tipo Unix, para ejecutables, código objeto, y —en sistemas posteriores— bibliotecas compartidas. Su nombre proviene de la contracción de la expresión en inglés assembler output, de acuerdo a lo dicho por Dennis Ritchie.
a.out sigue siendo el nombre de archivo de salida por defecto para ejecutables creados por ciertos compiladores/enlazadores cuando no se especifica un nombre de archivo de salida, aunque estos ejecutables ya no estén en el formato a.out.

## Uso histórico

En la primera edición de UNIX apareció un formato a.out para la PDP-7, similar al formato a.out usado en la PDP-11. Este fue sustituido por el formato COFF en el Unix System V de AT&T, que fue a su vez remplazado en System V Release 4 por el formato ELF.
Aunque Berkeley Unix siguió usando el formato a.out por algún tiempo, los sistemas BSD modernos desde entonces han cambiado al formato ELF. NetBSD/i386 cambió formalmente de a.out a ELF en su lanzamiento 1.5. FreeBSD/i386 cambió a ELF durante la transición de la versión 2.2 a la 3.0.
El soporte de a.out para obtener información de depuración se realiza mediante el uso de entradas especiales en la tabla de símbolos llamado stabs. El formato stabs también se ha utilizado en muchas variaciones de COFF y ELF.
Linux también usó a.out hasta el kernel 1.2, hasta que fue sustituido por ELF para esa plataforma de esta manera (el soporte para ELF fue añadido en la versión experimental 1.1.52).
La transición de Linux a ELF fue más o menos forzada debido a la naturaleza compleja que presentaba construir bibliotecas compartidas con a.out en esa plataforma, que incluía la necesidad de registrar el espacio virtual de direcciones en la que se encuentra la biblioteca con una autoridad central, tal como la biblioteca ld.so en formato a.out no pudo reubicar bibliotecas compartidas. Los varios sabores de BSD fueron capaces de continuar usando binarios a.out mucho tiempo después de que Linux fuera forzado a cambiar a ELF, debido a la naturaleza un tanto más flexible del formato a.out de BSD comparado con aquel de Linux. MINIX 3 cambió el formato de sus binarios a ELF en su versión 3.2.0.

## Descripción

Los ejecutables a.out normalmente vienen en una de las diversas variantes: OMAGIC, NMAGIC, QMAGIC o ZMAGIC.

### OMAGIC

    El formato OMAGIC tiene segmentos contiguos a continuación de su cabecera, sin separación de texto y datos. Este formato también se utilizó como formato de código objeto.

### NMAGIC

    El formato MAGIC era similar al OMAGIC, no obstante el segmento de datos era cargado inmediatamente en la siguiente página posterior al final del segmento de texto; y el segmento de texto fue marcado como de sólo lectura.

### ZMAGIC

    El formato ZMAGIC agregó soporte para paginación por demanda. La longitud de los segmentos de código y datos en el archivo tenía que ser múltiplos del tamaño de la página.

### QMAGIC

    Los binarios QMAGIC eran típicamente cargados una página encima de la parte inferior del espacio de direcciones virtuales, a fin de permitir la captura de desreferencias de punteros nulos a través de un fallo de segmentación. La cabecera de a.out se fusionó con la primera página del segmento de texto, generalmente salvando un valor de la página de memoria.

### CMAGIC

    Las versiones antiguas de Linux utilizan este formato para los volcados de memoria.

### Secciones en un binario a.out

Un archivo a.out se compone de un máximo de siete secciones, en el siguiente orden:
exec header (cabecera ejecutable)
    Contiene parámetros usados por el kernel para cargar un archivo binario en memoria y ejecutarlo, y por el editor de enlaces ld para combinar un archivo binario con otros archivos binarios. Esta sección es la única obligatoria.
text segment (segmento de texto)
    Contiene código máquina y datos conexos que se cargan en memoria cuando un programa se ejecuta. Puede ser cargado como sólo lectura.
data segment (segmento de datos)
    Contiene datos inicializados; siempre se cargan en memoria de escritura.
text relocations (reubicación de texto)
    Contiene registros usados por el editor de enlaces para actualizar punteros en el segmento de texto al combinar archivos binarios.
data relocations (reubicación de datos)
    Al igual que la sección de reubicación de texto, pero para los punteros del segmento de datos.
symbol table (tabla de símbolos)
    Contiene registros usados por el editor de enlaces para una referencua cruzada de la dirección de variables y funciones con nombre (symbols) entre archivos binarios.
string table (tabla de cadenas de texto)
    Contiene las cadenas de caracteres correspondientes a los nombres de símbolos.