COFF - COFF

COFF
Extensión de nombre de archivo
ninguno, .o , .obj , .lib
número mágico 4C 01 para 386 64 86 para AMD64 00 02 para Itanium
Desarrollado por Corporación AT&T
Tipo de formato Bibliotecas binarias , ejecutables , de objetos y compartidas
Extendido a Formato XCOFF , ECOFF , ejecutable portátil , ejecutable y enlazable

El formato de archivo de objeto común ( COFF ) es un formato para archivos de computadora ejecutables , de código objeto y de biblioteca compartida que se utilizan en sistemas Unix . Se introdujo en Unix System V , reemplazó el formato a.out utilizado anteriormente y formó la base para especificaciones extendidas como XCOFF y ECOFF , antes de ser reemplazado en gran parte por ELF , introducido con SVR4 . COFF y sus variantes continúan utilizándose en algunos sistemas similares a 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 admitir adecuadamente bibliotecas compartidas , identificación de formato externo o vinculación explícita de direcciones. A medida que el desarrollo de sistemas similares a Unix continuó tanto dentro como fuera de AT&T, surgieron diferentes soluciones para estos y otros problemas.

COFF se introdujo en 1983, en UNIX System V de AT&T para plataformas de 32 bits que no son VAX, como el 3B20 . Las mejoras sobre el formato existente de AT&T a.out incluyeron secciones arbitrarias, declaraciones explícitas del procesador y vinculación explícita de direcciones.

Sin embargo, el diseño COFF era demasiado limitado y no estaba completamente especificado: 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 como C , lenguajes mucho menos nuevos como C ++ o nuevos procesadores. Todas las implementaciones de COFF en el mundo real fueron necesariamente violaciones del estándar como resultado. Esto dio lugar a numerosas ampliaciones de COFF. IBM utilizó el formato XCOFF en AIX ; DEC , SGI y otros utilizaron ECOFF ; y numerosos puertos SysV y cadenas de herramientas dirigidas al desarrollo integrado, cada uno creó sus propias variaciones incompatibles.

Con el lanzamiento de SVR4, AT&T reemplazó COFF con ELF .

Mientras que las versiones extendidas de COFF siguen siendo utilizados por algún tipo Unix plataformas, principalmente en sistemas embebidos, quizás el uso más extendido del formato COFF hoy está en Microsoft 's ejecutable portátil formato (PE). Desarrollado para Windows NT , el formato PE (a veces escrito como PE / COFF) utiliza un encabezado COFF para archivos de objeto y como un componente del encabezado PE para archivos ejecutables.

Características

La principal mejora de COFF sobre a.out fue la introducción de múltiples secciones con nombre en el archivo de objeto. Los diferentes archivos de objetos pueden tener diferentes números 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, 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, clase de almacenamiento, tipo, valor y 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 la entidad de tipo que representa el símbolo y pueden incluir variables externas (C_EXT), variables automáticas (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 de símbolo e incluye valores para todos los tipos de datos 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 del número de línea tiene dos formas: en la primera, para cada posible punto de ruptura 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 el segundo formulario, 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 la fuente incluida, como ocurre con los archivos de encabezado, lo que hace que la información de depuración de COFF sea prácticamente inútil sin extensiones incompatibles.

Dirección virtual relativa

Cuando se genera un archivo COFF, generalmente no se sabe en qué parte de la memoria se cargará. La dirección virtual donde se cargará el primer byte del archivo se llama dirección base de 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 que se carga en la memoria, menos la dirección base de la imagen del archivo. Si el archivo se mapea literalmente del disco a la memoria, el RVA sería el mismo que el del desplazamiento en el archivo, pero esto en realidad es bastante inusual.

Tenga en cuenta que el término RVA solo se usa con objetos en el archivo de imagen. Una vez cargada en la memoria, se agrega la dirección base de la imagen y se utilizan VA ordinarios.

Problemas

El encabezado del archivo COFF almacena la fecha y la hora en que se creó el archivo objeto como un entero binario de 32 bits, que representa el número de segundos desde la época 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.

Ver también

Notas

  1. ^ "Referencia LIB (Guía de programadores de Visual C ++ incrustado)" . msdn.microsoft.com . Archivado desde el original el 25 de agosto de 2003 . Consultado el 4 de febrero de 2021 . CS1 maint: parámetro desalentado ( enlace )
  2. ^ "IMAGE_FILE_HEADER (winnt.h) - Aplicaciones Win32" . 2018-05-12 . Consultado el 6 de febrero de 2021 .
  3. ^ Microsoft Corporation 2006b

Referencias

enlaces externos