Un archivo de objeto es un archivo de computadora que contiene un código de objeto , es decir, la salida de código de máquina de un ensamblador o compilador . El código objeto suele ser reubicable y no suele ser directamente ejecutable . Hay varios formatos para archivos de objetos y el mismo código de máquina se puede empaquetar en diferentes formatos de archivos de objetos. Un archivo de objeto también puede funcionar como una biblioteca compartida .
Además del código de objeto en sí, los archivos de objeto pueden contener metadatos utilizados para vincular o depurar, que 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 , información de depuración o creación de perfiles .
El término "programa objeto" data de al menos 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]
Un programador de computadoras genera código objeto con un compilador . Por ejemplo, bajo Linux, el compilador GNU Compiler Collection generará archivos que tienen una extensión .o y usan el formato ELF . En Windows , tienen una extensión .obj y usan el formato COFF . Luego, se usa un enlazador para combinar el código de objeto en un programa ejecutable o biblioteca que extrae bibliotecas del sistema precompiladas según sea necesario. Por el contrario, los scripts ( Python o JavaScript ) se interpretan y los programas Java (lenguaje de programación ) se compilan en archivos de clases de códigos de bytes.
Formatos de archivo de objeto
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 COFF y ELF , se han definido y utilizado en diferentes tipos de sistemas. Es posible utilizar el mismo formato de archivo como entrada y salida del enlazador y, por lo tanto, como biblioteca y formato de archivo ejecutable . [2] : p.16 Algunos formatos pueden contener código de máquina para diferentes procesadores, con el correcto elegido por el sistema operativo cuando se carga el programa. [3]
Algunos sistemas distinguen entre archivos que son directamente ejecutables y archivos que requieren procesamiento por parte del enlazador. Por ejemplo, OS / 360 y sus sucesores llaman al primer formato un módulo de carga y al segundo un módulo de objeto . En este caso, los archivos tienen formatos completamente diferentes.
El diseño y / o la elección de un formato de archivo de objeto es una parte clave del diseño general del sistema. Afecta al rendimiento del enlazador y, por lo tanto, a la respuesta del programador mientras se desarrolla un programa. Si el formato se usa 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 de los usuarios.
Archivos de objetos absolutos
Muchas de las primeras computadoras, o pequeñas microcomputadoras , solo admiten un formato de objeto absoluto. Los programas no son reubicables; deben ensamblarse o compilarse para ejecutarse en direcciones específicas predefinidas. El archivo no contiene información de reubicación o vinculación. Estos archivos pueden cargarse en la memoria de lectura / escritura o almacenarse en la memoria de solo lectura . Por ejemplo, el monitor Motorola 6800 MIKBUG contiene una rutina para leer un archivo de objeto absoluto ( formato SREC ) de una cinta de papel . [4] Los archivos COM de DOS son un ejemplo más reciente de archivos de objetos absolutos. [5]
Segmentación
La mayoría de los formatos de archivos de objetos están estructurados como secciones separadas de datos, cada sección contiene un cierto tipo de datos. Estas secciones se conocen como "segmentos" debido al término " segmento de memoria ", que anteriormente era una forma común de gestión de la memoria . Cuando un cargador carga un programa en la memoria , el cargador asigna varias regiones de memoria al programa. Algunas de estas regiones corresponden a segmentos del archivo de objeto y, por lo tanto, generalmente se conocen con los mismos nombres. Otros, 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 es manejada por la unidad de administración de memoria o por un código independiente de la posición . En algunos sistemas, los segmentos del archivo de objeto se pueden copiar (paginar) en la memoria y ejecutar, sin necesidad de procesamiento adicional. En estos sistemas, esto se puede hacer de forma perezosa , 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 objeto.
Tipos de datos admitidos por formatos de archivo de objeto típicos: [6]
- Encabezado (información descriptiva y de control)
- Segmento de código ("segmento de texto", código ejecutable)
- Segmento de datos ( variables estáticas inicializadas )
- Segmento de datos de solo lectura ( rodata , constantes estáticas inicializadas )
- Segmento BSS (datos estáticos no inicializados, tanto variables como constantes)
- Definiciones y referencias externas para vincular
- Información de reubicación
- Información de vinculación dinámica
- Información de depuración
El enlazador puede combinar segmentos en diferentes archivos de objetos de acuerdo con las reglas especificadas cuando se definen los segmentos. Existen convenciones para segmentos compartidos entre archivos objeto; por ejemplo, en DOS existen diferentes modelos de memoria que especifican los nombres de los segmentos especiales y si se pueden combinar o no. [7]
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 puñaladas o DWARF .
El Proyecto GNU 's binario biblioteca de descriptores de archivos (biblioteca BFD) proporciona un común API para la manipulación de archivos de objetos en una variedad de formatos.
Referencias
- ^ Wrubel, mariscal H. (1959). Una cartilla de programación para computadoras digitales . Nueva York: McGraw-Hill. pag. 222 . Consultado el 31 de julio de 2020 .
- ^ IBM Corporation (1973). Editor y cargador de enlaces de SO de IBM (PDF) . Consultado el 6 de agosto de 2012 .
- ^ "FatELF: binarios universales para Linux" . Consultado el 2 de agosto de 2020 .
- ^ Wiles, Mike; Felix, Andre. MCM6830L7 ROM MIKBUG / MINIBUG (PDF) . Motorola Semiconductor Products, Inc . Consultado el 31 de julio de 2020 .
- ^ Godse, DA; Godse, AP (2008). Microprocesador - I (Primera ed.). Pune: Publicaciones técnicas. págs. 3-15. ISBN 978-81-8431-355-0.
- ^ Mauerer, Wolfgang (2010). Arquitectura profesional del kernel de Linux . John Wiley e hijos. pag. Apéndice E: El formato binario ELF. ISBN 978-0-470-34343-2. Consultado el 1 de agosto de 2020 .
- ^ Irvine, Kip R. (1993), lenguaje ensamblador para IBM-PC (2a ed.), Nueva York: Macmillan, ISBN 0-02-359651-1
Otras lecturas
- Levine, John R. (2000). Enlazadores y cargadores . Editores Morgan Kaufmann. pag. 256. ISBN 1-55860-496-0.