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.[1]
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,[2] aunque estos ejecutables ya no estén en el formato a.out
.
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.[3] 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.[2]
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).[4]
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.[5] 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.[6][7] MINIX 3 cambió el formato de sus binarios a ELF en su versión 3.2.0.
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
[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.
- ↑ Ritchie, Dennis (abril de 1993). «The Development of the C Language*» [La evolución de el lenguaje C] (html). Bell Labs (en inglés). Archivado desde el original el 11 de junio de 2015. Consultado el 21 de abril de 2020. «(This name, a.out, explains a bit of Unix etymology; it is the output of the assembler. Even after the system gained a linker and a means of specifying another name explicitly, it was retained as the default executable result of a compilation.)».
- ↑ a b Rupert, Wood (8 de abril de 2002), «RE: What to do with a.out», lista de correo Proyecto GCC, archivado del original el 21 de abril de 2020, https://web.archive.org/web/20200421135140/https://gcc.gnu.org/legacy-ml/gcc-help/2002-04/msg00075.html, consultado el 21 de abril de 2020.
- ↑ Dennis Ritchie (3 de noviembre de 1971), a.out — assembler and link editor output (PDF), Bell Labs, archivado desde el original el 7 de diciembre de 2006, consultado el 24 de noviembre de 2006 .
- ↑ Daniel Barlow (14 de julio de 1996). «The Linux ELF HOWTO (v1.29)». Archivado desde el original el 13 de julio de 2004. Consultado el 28 de marzo de 2008.
- ↑ Ulrich Drepper (20 de agosto de 2006). «1.1 A Little Bit of History» (PDF). How To Write Shared Libraries. 4.0. Archivado desde el original el 16 de junio de 2007. Consultado el 20 de junio de 2007. «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.»
- ↑
Eric Youngdale (1 de abril de 1995). «The ELF Object File Format: Introduction». Archivado desde el original el 10 de marzo de 2009. Consultado el 6 de mayo de 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 (...)».
- ↑ «BSD Myths». Archivado desde el original el 17 de abril de 2007. Consultado el 10 de abril de 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.»