El formato COFF ( Common Object File Format ) es un formato para archivos ejecutables , de código objeto y de bibliotecas compartidas utilizado en sistemas Unix . Se introdujo en Unix System V , reemplazó al formato a.out utilizado anteriormente y sirvió de base para especificaciones extendidas como XCOFF y ECOFF , antes de ser reemplazado en gran medida por ELF , introducido con SVR4 . COFF y sus variantes se siguen utilizando en algunos sistemas tipo Unix , en Microsoft Windows ( Portable Executable ), en entornos UEFI y en algunos sistemas de desarrollo embebidos.
Historia
El formato de archivo objeto original de Unix, a.out, no admite adecuadamente bibliotecas compartidas , identificación de formatos externos ni enlaces de direcciones explícitos. A medida que continuaba el desarrollo de sistemas tipo Unix tanto dentro como fuera de AT&T , surgieron diferentes soluciones para estos y otros problemas.
COFF se introdujo en 1983 en el sistema UNIX System V de AT&T para plataformas de 32 bits que no eran VAX, como la 3B20 . Las mejoras con respecto al formato a.out existente de AT&T incluían secciones arbitrarias, declaraciones explícitas del procesador y enlace explícito de direcciones.
Sin embargo, el diseño de COFF era demasiado limitado y estaba especificado de forma incompleta. Existían limitaciones en el número de secciones, la longitud de los nombres de las secciones y el número de archivos fuente incluidos. Además, la información de depuración simbólica era incapaz de admitir lenguajes de programación reales como C ++ , y mucho menos lenguajes más recientes como C++ y nuevas arquitecturas de conjuntos de instrucciones . Como resultado, todas las implementaciones reales de COFF incumplían necesariamente el estándar. Esto dio lugar a numerosas extensiones de COFF. IBM utilizó el formato XCOFF en el sistema operativo AIX ; DEC , SGI y otros utilizaron ECOFF ; y numerosos puertos SysV y cadenas de herramientas para el desarrollo de sistemas embebidos crearon sus propias variantes incompatibles.
Con el lanzamiento de SVR4, AT&T reemplazó el formato COFF por el formato ejecutable y enlazable (ELF).
Aunque las versiones extendidas de COFF se siguen utilizando en algunas plataformas Unix y similares, principalmente en sistemas embebidos , quizás el uso más extendido del formato COFF hoy en día sea en el formato Portable Executable (PE) de Microsoft . Desarrollado para Windows NT , el formato PE (a veces escrito como PE/COFF) utiliza una cabecera COFF para archivos objeto y como componente de la cabecera PE para archivos ejecutables. [ 3 ]
Características
La principal mejora de COFF con respecto a a.out fue la introducción de múltiples secciones con nombre en el archivo objeto. Los distintos archivos objeto podían tener distintos números y tipos de secciones.
Información de depuración simbólica
La información de depuración simbólica de COFF consiste en nombres simbólicos ( cadenas de caracteres ) para las funciones y variables del programa, e información sobre el número de línea, que se utiliza para establecer puntos de interrupción y rastrear la ejecución.
Los nombres simbólicos se almacenan en la tabla de símbolos COFF. Cada entrada de la tabla de símbolos incluye un nombre, una clase de almacenamiento, un tipo, un valor y un número de sección. Los nombres cortos (de 8 caracteres o menos) se almacenan directamente en la tabla de símbolos; los nombres más largos se almacenan como un desplazamiento en la tabla de cadenas al final del objeto COFF.
Las clases de almacenamiento describen el tipo de entidad que representa el símbolo y pueden incluir variables externas (C_EXT), variables automáticas (de pila) (C_AUTO), variables de registro (C_REG), funciones (C_FCN) y muchas otras. El tipo de símbolo describe la interpretación del valor de la entidad del símbolo e incluye valores para todos los tipos de datos de C.
Cuando se compila con las opciones adecuadas, un archivo objeto COFF contiene información de número de línea para cada posible punto de interrupción en la sección de texto del archivo objeto. Esta información se presenta de dos formas: en la primera, para cada posible punto de interrupción en el código, la entrada de la tabla de números de línea registra la dirección y su número de línea correspondiente. En la segunda forma, la entrada identifica una entrada de la tabla de símbolos que representa el inicio de una función, lo que permite establecer un punto de interrupción utilizando el nombre de la función.
Tenga en cuenta que COFF no era capaz de representar números de línea ni símbolos de depuración para el código fuente incluido, como ocurría con los archivos de cabecera, lo que hacía que la información de depuración de COFF fuera prácticamente inútil sin extensiones incompatibles.
Dirección virtual relativa
Cuando se genera un archivo COFF, normalmente no se sabe en qué parte de la memoria se cargará. La dirección virtual donde se cargará el primer byte del archivo se denomina dirección base de la imagen . El resto del archivo no se carga necesariamente en un bloque contiguo, sino en diferentes secciones .
Las direcciones virtuales relativas (RVA) no deben confundirse con las direcciones virtuales estándar. Una dirección virtual relativa es la dirección virtual de un objeto del archivo una vez cargado en memoria, menos la dirección base de la imagen del archivo. Si el archivo se mapeara literalmente del disco a la memoria, la RVA sería la misma que la del desplazamiento dentro del archivo, pero esto es bastante inusual.
Tenga en cuenta que el término RVA solo se utiliza con objetos en el archivo de imagen. Una vez cargado en la memoria, se agrega la dirección base de la imagen y se utilizan las direcciones virtuales (VA) ordinarias.
Problemas
El encabezado del archivo COFF almacena la fecha y hora de creación del archivo objeto como un entero binario de 32 bits, que representa el número de segundos transcurridos desde la época Unix , el 1 de enero de 1970 a las 00:00:00 UTC . Por lo tanto, las fechas posteriores al 19 de enero de 2038 no pueden almacenarse en este formato (el problema del año 2038 ). [ 4 ] : 11–4
Véase también
Referencias
- ↑ "LIB Reference (Embedded Visual C++ Programmers Guide)" . msdn.microsoft.com . Archivado del original el 25/08/2003 . Consultado el 04/02/2021 .
- ↑ "Estructura IMAGE_FILE_HEADER (winnt.h)" . 12/05/2018 . Consultado el 22/12/2023 .
- ↑ Microsoft Corporation 2006b
- ↑ "11 Formato de archivo de objeto común (COFF)". Guía del programador del sistema UNIX V/386 versión 3.2, volumen II (PDF) . Prentice-Hall . 1989. ISBN 0-13-944885-3.
Lecturas adicionales
- Especificación MIPS COFF
- Gircys, Gintaras (1988), Comprensión y uso de COFF , O'Reilly and Associates, ISBN 0-937175-31-5
- Microsoft Corporation (2006b), Formato de archivo de objeto común (COFF) (Edición de revisión 4.1 ), archivado del original el 16 de diciembre de 2006 , recuperado el 2 de junio de 2007.
- "Breve historia de los formatos de archivo de objetos de TI" . Archivado del original el 26 de noviembre de 2023.
- Formato de archivo de objeto común (PDF) . Texas Instruments .
Enlaces externos
- Un análisis en profundidad de la documentación del formato de archivo ejecutable portátil Win32 y del formato PE en Microsoft.
- Formatos de archivos ejecutables