c++ - ¿Qué es "objeto" en "archivo de objeto" y por qué se llama de esta manera?
compilation linker (4)
Creo que el nombre tiene algo que ver con hacer una distinción entre:
- código para humanos - código fuente
- código para máquinas - código objeto
Los archivos de objetos contienen:
- Información de encabezado: información general sobre el archivo, como el tamaño del código, el nombre del archivo de origen desde el que se tradujo y la fecha de creación.
- Código de objeto: instrucciones binarias y datos generados por un compilador o ensamblador.
- Reubicación: una lista de los lugares en el código de objeto que se deben corregir cuando el vinculador cambia las direcciones del código de objeto.
- Símbolos: símbolos globales definidos en este módulo, símbolos que se importarán de otros módulos o que se definirán mediante el enlazador.
- Información de depuración: Otra información sobre el código objeto no es necesaria para vincularse, pero sí para usarla con un depurador. Esto incluye el archivo de origen y la información del número de línea, los símbolos locales, las descripciones de las estructuras de datos utilizadas por el código objeto, como las definiciones de la estructura C.
Fuente: here
Esta pregunta ya tiene una respuesta aquí:
- ¿Qué es un archivo objeto en C? 5 respuestas
Me hicieron una pregunta: "¿Qué es un ''archivo de objeto''?".
Después de mirar Wiki , solo sé que contiene objetos .
¿Pero cuáles son esos objetos y por qué alguien los llamó así?
De acuerdo con la página que vinculó, Cada secuencia, u objeto, generalmente contiene instrucciones para que la máquina anfitriona realice alguna tarea, posiblemente acompañada de datos y metadatos relacionados (por ejemplo, información de reubicación, información de desenrollado de la pila, comentarios, símbolos de programas, depuración o información de perfiles) ).
Básicamente, cada objeto en el archivo de objeto es una función, y la información relevante para que el enlazador la incluya en el programa completo.
Los archivos de objeto (o código de objeto) son archivos de código de máquina generados por un compilador a partir del código fuente.
La diferencia con un ejecutable es que el archivo objeto no está vinculado, por lo que las referencias a funciones, símbolos, etc. aún no están definidas (sus direcciones de memoria se dejan en blanco).
Cuando compilas un archivo C con GCC:
gcc -Wall -o test test.c
Aquí estás compilando Y enlazando. Así que obtendrás un ejecutable que contiene todas las referencias de direcciones de memoria para los símbolos que contiene (bibliotecas, encabezados, etc.).
Pero cuando haces esto:
gcc -Wall -o test.o -c test.c
Producirás un archivo de objeto. También es un código de máquina, pero deberá estar vinculado para generar un ejecutable o una biblioteca.
Cuando tiene un proyecto con muchos archivos C (por ejemplo), compilará cada uno en código de objeto y luego vinculará todos los archivos de objeto para producir el producto final.
Por ejemplo:
gcc -Wall -o foo.o -c foo.c // Object file for foo.c
gcc -Wall -o bar.o -c bar.c // Object file for bar.c
gcc -Wall -o main.o -c main.c // Object file for main.c
gcc -Wall -o software foo.o bar.o main.o // Executable (foo + bar + main)
El término objeto representa aquí secuencias de código de máquina no vinculado (básicamente). Un archivo de objeto contiene objetos.
Usted preguntó: ¿por qué es esta llamada de esa manera. Realmente no puedo responder. ¿Por qué "azul" se llama "azul"? ; )
Es solo el término usado desde ... bueno, décadas ...
Para información, la documentación de GCC Internals solo define el código de objeto como:
El "código fuente" para un trabajo significa la forma preferida del trabajo para realizar modificaciones. "Código de objeto" significa cualquier forma no fuente de un trabajo.
Bastante vago sobre la razón histórica ...
Simplemente espero que ahora entiendas mejor qué es un archivo de objeto. Creo que es más importante que saber por qué se llama así, ya que las palabras son solo, bueno, palabras ...
Un archivo de objeto es una representación binaria del archivo de origen (texto). Es una colección de varias secciones segragando tipo de datos en:
- sección de texto
- sección de datos
- apilar
- montón
Dependiendo de su compilador / entorno estos pueden diferir.
Por ejemplo, en sistemas * nix:
objdump -d a.out <--- proporcionar que compilamos a.cpp
disassembly of section .init:
08048278 <_init>:
8048278: 55 push %ebp
8048279: 89 e5 mov %esp,%ebp
804827b: 83 ec 08 sub $0x8,%esp
804827e: e8 61 00 00 00 call 80482e4 <call_gmon_start>
8048283: e8 b3 00 00 00 call 804833b <frame_dummy>
8048288: e8 9f 01 00 00 call 804842c <__do_global_ctors_aux>
804828d: c9 leave
804828e: c3 ret
Disassembly of section .plt:
08048290 <puts@plt-0x10>:
8048290: ff 35 78 95 04 08 pushl 0x8049578
8048296: ff 25 7c 95 04 08 jmp *0x804957c
804829c: 00 00 add %al,(%eax)
...
080482a0 <puts@plt>:
80482a0: ff 25 80 95 04 08 jmp *0x8049580
80482a6: 68 00 00 00 00 push $0x0
80482ab: e9 e0 ff ff ff jmp 8048290 <_init+0x18>
080482b0 <__libc_start_main@plt>:
80482b0: ff 25 84 95 04 08 jmp *0x8049584
80482b6: 68 08 00 00 00 push $0x8
80482bb: e9 d0 ff ff ff jmp 8048290 <_init+0x18>
Disassembly of section .text:
A los diversos comandos de llamada aquí les gustan las diversas bibliotecas para llamar a las funciones reales.