Un archivo de objeto es un archivo que contiene código de máquina o bytecode , así como otros datos y metadatos , generados por un compilador o ensamblador a partir del código fuente durante el proceso de compilación o ensamblaje. El código de máquina que se genera se conoce como código de objeto .
El código objeto suele ser reubicable y no ejecutable directamente . Existen varios formatos de archivos objeto y el mismo código de máquina se puede empaquetar en diferentes formatos de archivos objeto. Un archivo objeto también puede funcionar como una biblioteca compartida .
Los metadatos que pueden incluir los archivos de objetos se pueden utilizar para vincular o depurar; incluyen información para resolver referencias cruzadas simbólicas entre diferentes módulos, información de reubicación , información de desenrollado de pila , comentarios , símbolos de programa e información de depuración o creación de perfiles . Otros metadatos pueden incluir la fecha y hora de compilación, el nombre y la versión del compilador y otra información de identificación.
El término "programa objeto" data al menos de la década de 1950:
Término en programación automática para el programa en lenguaje de máquina producido por la máquina al traducir un programa fuente escrito por el programador en un lenguaje similar a la notación algebraica. [1]
Se utiliza un enlazador para combinar el código objeto en un programa ejecutable o biblioteca incorporando bibliotecas del sistema precompiladas según sea necesario.
Hay muchos formatos de archivos de objetos diferentes; originalmente, cada tipo de computadora tenía su propio formato único, pero con la llegada de Unix y otros sistemas operativos portátiles , algunos formatos, como ELF y COFF , se han definido y utilizado en diferentes tipos de sistemas.
Algunos sistemas distinguen entre formatos que son directamente ejecutables y formatos que requieren procesamiento por parte del enlazador . Por ejemplo, OS/360 y sus sucesores denominan al primer formato módulo de carga y al segundo módulo de objeto . En este caso, los archivos tienen formatos completamente diferentes. [2] DOS y Windows también tienen diferentes formatos de archivo para archivos ejecutables y archivos de objeto, como Portable Executable para ejecutables y COFF para archivos de objeto en Windows de 32 y 64 bits.
Los sistemas Unix y similares han utilizado el mismo formato para los archivos ejecutables y de objeto, comenzando con el formato original a.out . Algunos formatos pueden contener código de máquina para diferentes procesadores, y el sistema operativo elige el correcto cuando se carga el programa. [3] [4]
El diseño o la elección de un formato de archivo de objeto es una parte clave del diseño general del sistema. Afecta el rendimiento del enlazador y, por lo tanto, el tiempo de respuesta del programador mientras se desarrolla un programa. Si el formato se utiliza para ejecutables, el diseño también afecta el tiempo que tardan los programas en comenzar a ejecutarse y, por lo tanto, la capacidad de respuesta para los usuarios.
La biblioteca de descriptores de archivos binarios del Proyecto GNU (biblioteca BFD) proporciona una API común para la manipulación de archivos de objetos en una variedad de formatos.
Muchos de los primeros ordenadores, o pequeños microordenadores , sólo admiten un formato de objeto absoluto. Los programas no son reubicables; necesitan ser ensamblados o compilados para ejecutarse en direcciones específicas predefinidas. El archivo no contiene información de reubicación o enlace. Estos archivos se pueden cargar en la memoria de lectura/escritura, o almacenar en la memoria de sólo lectura . Por ejemplo, el monitor Motorola 6800 MIKBUG contiene una rutina para leer un archivo de objeto absoluto ( formato SREC ) desde una cinta de papel . [5] Los archivos COM de DOS son un ejemplo más reciente de archivos de objeto absoluto. [6]
La mayoría de los formatos de archivos de objetos están estructurados como secciones de datos independientes, cada una de las cuales contiene un tipo de datos determinado. Estas secciones se conocen como "segmentos" debido al término " segmento de memoria ", que anteriormente era una forma común de gestión de memoria . Cuando un cargador carga un programa en la memoria , este asigna varias regiones de memoria al programa. Algunas de estas regiones corresponden a secciones del archivo de objetos y, por lo tanto, suelen conocerse por los mismos nombres. Otras, como la pila, solo existen en tiempo de ejecución. En algunos casos, el cargador (o enlazador) realiza la reubicación para especificar las direcciones de memoria reales. Sin embargo, para muchos programas o arquitecturas, la reubicación no es necesaria, debido a que se gestiona mediante la unidad de gestión de memoria o mediante código independiente de la posición . En algunos sistemas, los segmentos del archivo de objetos se pueden copiar (paginar) en la memoria y ejecutar, sin necesidad de procesamiento adicional. En estos sistemas, esto se puede hacer de forma diferida , es decir, solo cuando se hace referencia a los segmentos durante la ejecución, por ejemplo, a través de un archivo mapeado en memoria respaldado por el archivo de objeto.
Tipos de datos admitidos por formatos de archivos de objetos típicos: [7]
El enlazador puede combinar segmentos de distintos archivos de objetos según las reglas especificadas cuando se definen los segmentos. Existen convenciones para los segmentos compartidos entre archivos de objetos; por ejemplo, en DOS hay distintos modelos de memoria que especifican los nombres de segmentos especiales y si se pueden combinar o no. [8]
El formato de datos de depuración de la información de depuración puede ser una parte integral del formato de archivo de objeto, como en COFF , o un formato semiindependiente que puede usarse con varios formatos de objeto, como stabs o DWARF .