El formato Common Object File Format ( COFF ) es un formato para archivos ejecutables , de código objeto y de bibliotecas compartidas que se utiliza en sistemas Unix . Se introdujo en Unix System V , reemplazó al formato a.out utilizado anteriormente y formó la base para especificaciones extendidas como XCOFF y ECOFF , antes de ser reemplazado en gran medida por ELF , introducido con SVR4 . COFF y sus variantes continúan utilizándose en algunos sistemas tipo Unix , en Microsoft Windows ( Portable Executable ), en entornos UEFI y en algunos sistemas de desarrollo integrados.
Historia
El formato de archivo de objeto Unix original a.out no puede soportar adecuadamente bibliotecas compartidas , identificación de formatos extranjeros, [ cita requerida ] o enlace de direcciones explícito. [ cita requerida ] A medida que el desarrollo de sistemas similares a Unix continuó tanto dentro como fuera de AT&T , surgieron diferentes soluciones a estos y otros problemas.
COFF se introdujo en 1983 en el UNIX System V de AT&T para plataformas de 32 bits que no eran VAX, como el 3B20 . [ cita requerida ] Las mejoras sobre el formato a.out de AT&T existente incluían secciones arbitrarias, declaraciones explícitas de procesador y enlace de direcciones explícito.
Sin embargo, el diseño de COFF era demasiado limitado y estaba especificado de forma incompleta: había un límite en el número máximo de secciones, un límite en la longitud de los nombres de las secciones, archivos fuente incluidos y la información de depuración simbólica era incapaz de soportar lenguajes del mundo real como C , mucho menos lenguajes más nuevos como C++ o nuevos procesadores. Todas las implementaciones del mundo real de COFF eran necesariamente violaciones del estándar como resultado. Esto condujo a numerosas extensiones de COFF. IBM utilizó el formato XCOFF en AIX ; DEC , SGI y otros utilizaron ECOFF ; y numerosos puertos SysV y cadenas de herramientas destinadas al desarrollo integrado crearon cada uno sus propias variaciones incompatibles.
Con el lanzamiento de SVR4, AT&T reemplazó COFF con ELF .
Aunque se siguen utilizando versiones extendidas de COFF para algunas plataformas Unix y similares, principalmente en sistemas integrados , quizás el uso más extendido del formato COFF en la actualidad sea el formato Portable Executable (PE) de Microsoft . Desarrollado para Windows NT , el formato PE (a veces escrito como PE/COFF) utiliza un encabezado COFF para archivos de objeto y como componente del encabezado 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 de objeto. Los distintos archivos de objeto podían tener diferentes cantidades y tipos de secciones.
Información de depuración simbólica
La información de depuración simbólica de COFF consta de nombres simbólicos ( cadenas ) para funciones y variables del programa, e información de número de línea, utilizada 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 (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 de objeto COFF contendrá información de número de línea para cada posible punto de interrupción en la sección de texto del archivo de objeto. La información de número de línea toma dos formas: en la primera, para cada posible punto de interrupción en el código, la entrada de la tabla de número 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 fue capaz de representar números de línea o símbolos de depuración para el código fuente incluido, como sucedió con los archivos de encabezado, lo que hizo 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, no se suele saber 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 secciones diferentes .
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 que se carga en la 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 hacia el 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 los VA comunes.
Problemas
El encabezado del archivo COFF almacena la fecha y la hora en que se creó el archivo de objeto como un entero binario de 32 bits, que representa la cantidad de segundos desde la época de Unix , el 1 de enero de 1970 a las 00:00:00 UTC . Las fechas posteriores al 19 de enero de 2038 no se pueden almacenar en este formato , lo que genera una instancia del problema del año 2038. [4] : 11–4
Véase también
Referencias
- ^ "Referencia de LIB (Guía del programador de Visual C++ integrado)". msdn.microsoft.com . Archivado desde el original el 25 de agosto de 2003 . Consultado el 4 de febrero de 2021 .
- ^ "Estructura IMAGE_FILE_HEADER (winnt.h)". 2018-05-12 . Consultado el 2023-12-22 .
- ^ Corporación Microsoft 2006b
- ^ "11 Formato de archivo de objeto común (COFF)". Guía del programador de UNIX System V/386 Release 3.2, volumen II (PDF) . Prentice-Hall . 1989. ISBN. 0-13-944885-3.
Lectura adicional
- Especificaciones MIPS COFF
- Gircys, Gintaras (1988), Comprensión y uso de COFF , O'Reilly and Associates, ISBN 0-937175-31-5
- Microsoft Corporation (2006b), Common Object File Format (COFF) (Revisión 4.1 ed.), archivado desde el original el 16 de diciembre de 2006 , consultado el 2 de junio de 2007
- "Una breve historia de los formatos de archivos de objetos TI". Archivado desde el original el 26 de noviembre de 2023.
- "Formato de archivo de objeto común" (PDF) . Texas Instruments .
Enlaces externos
- Una mirada en profundidad a la documentación del formato de archivo ejecutable portátil Win32 y del formato PE en Microsoft