a.out

De Wikipedia, la enciclopedia libre
Saltar a: navegación, búsqueda
a.out
Desarrollador
AT&T
Información general
Extensión de archivo ninguna, .o, .so
Tipo de formato Binario, ejecutable, código objeto, bibliotecas compartidas
Formato abierto ?

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 en su trabajo The Development of the C Language.

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.[1]

Uso histórico[editar]

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.[2] Este fue sustituido por el formato COFF en el Unix System V de AT&T, que fue a su vez remplazado por el formato ELF en System V Release 4.

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).[3]

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.[4] 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.[5] [6] MINIX 3 cambió el formato de sus binarios a ELF en su versión 3.2.0.

Descripción[editar]

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

OMAGIC
El formato OMAGIC tiene segmentos contígüos 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 fín 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[editar]

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.

Véase también[editar]

Referencias[editar]

  1. Wood, Rupert (8 de abril de 2002), «What to do with a.out» (en inglés), lista de correo gcc-help, http://gcc.gnu.org/ml/gcc-help/2002-04/msg00075.html, consultado el 28 de abril de 2007. 
  2. Dennis Ritchie (1971-11-03) (PDF), a.out — assembler and link editor output, Bell Labs, http://cm.bell-labs.com/cm/cs/who/dmr/man51.pdf, consultado el 2006-11-24 
  3. Daniel Barlow (14 de julio de 1996). «The Linux ELF HOWTO (v1.29)». Consultado el 28-03-2008.
  4. Ulrich Drepper (2006-08-20) (PDF). How To Write Shared Libraries. 4.0. Archivado del original el 16 June 2007. http://web.archive.org/web/20070616175733/http://people.redhat.com/drepper/dsohowto.pdf. Consultado el 2007-06-20. «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.». 
  5. Eric Youngdale (01-04-1995). «The ELF Object File Format: Introduction». Archivado desde el original el 10 March 2009. Consultado el 06-05-2012. «(...) it is not impossible to design shared library implementations that work with a.out. The current Linux shared libraries are certainly one example; another example is SunOS-style shared libraries which are currently used by BSD-du-jour. SunOS-style shared libraries contain a lot of the same concepts as ELF shared libraries (...)».
  6. «BSD Myths». Archivado desde el original el 17 April 2007. Consultado el 10-04-2007. «There were no pressing reasons to switch earlier. In particular, FreeBSD did not (and does not) have the problems building shared libraries that spurred the Linux conversion from a.out to ELF.».

Enlaces externos[editar]