¿Qué es un archivo de objeto en C?

140

Estoy leyendo sobre bibliotecas en C pero aún no he encontrado una explicación sobre qué es un archivo de objeto. ¿Cuál es la verdadera diferencia entre cualquier otro archivo compilado y un archivo objeto?
Me alegraría si alguien pudiera explicar en lenguaje humano.

Pithikos
fuente
Una versión más activa de esto: stackoverflow.com/questions/12122446/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Respuestas:

153

Un archivo de objeto es el resultado real de la fase de compilación. En su mayoría es código de máquina, pero tiene información que le permite a un enlazador ver qué símbolos contiene, así como los símbolos que necesita para funcionar. (Como referencia, los "símbolos" son básicamente nombres de objetos globales, funciones, etc.)

Un vinculador toma todos estos archivos de objetos y los combina para formar un ejecutable (suponiendo que pueda, es decir, que no hay símbolos duplicados o indefinidos). Muchos compiladores harán esto por usted (lea: ejecutan el enlazador por su cuenta) si no les dice que "solo compilen" usando las opciones de la línea de comandos. ( -ces una opción común de "solo compilar; no vincular").

cHao
fuente
En realidad, con la mayoría de los compiladores, el resultado de la fase de compilación es el código de ensamblaje, y el compilador invoca al ensamblador para convertirlo en un archivo objeto.
Chris Dodd
15
@ChrisDodd: Ese fue a menudo el caso con compiladores antiguos. En estos días, un compilador no generará código de ensamblaje a menos que se lo pida, y a menudo no lo usa internamente. Pero de cualquier manera, el ensamblaje sería una subfase de la fase de compilación, por lo que todo eso es discutible.
cHao
2
¿Puede un único archivo de objeto ser ejecutable?
Miel
1
@Honey: en general, no. Incluso si el archivo objeto estuviera en un formato diseñado para la ejecución (que básicamente nunca es), esa parte sobre "símbolos que requiere para funcionar" básicamente mata el trato. Incluso su "mundo hola" estándar requiere vincular contra una biblioteca de tiempo de ejecución de C.
cHao
74
  1. Un archivo Object es el archivo compilado en sí. No hay diferencia entre los dos.

  2. Un archivo ejecutable se forma al vincular los archivos Object.

  3. El archivo de objeto contiene instrucciones de bajo nivel que la CPU puede entender. Es por eso que también se llama código de máquina.

  4. Este código de máquina de bajo nivel es la representación binaria de las instrucciones que también puede escribir directamente usando el lenguaje ensamblador y luego procesar el código del lenguaje ensamblador (representado en inglés) en lenguaje máquina (representado en hexadecimal) utilizando un ensamblador.

Aquí hay un flujo típico de alto nivel para este proceso para código en lenguaje de alto nivel como C

-> pasa por preprocesador

-> para dar código optimizado, aún en C

-> pasa por el compilador

-> para dar código de ensamblaje

-> pasa por un ensamblador

-> para dar código en lenguaje de máquina que se almacena en ARCHIVOS DE OBJETOS

-> pasa por Linker

-> para obtener un archivo ejecutable.

Este flujo puede tener algunas variaciones, por ejemplo, la mayoría de los compiladores pueden generar directamente el código de lenguaje de máquina, sin pasar por un ensamblador. Del mismo modo, pueden hacer el preprocesamiento por usted. Aún así, es bueno dividir los componentes para una mejor comprensión.

RHT
fuente
55
El código optimizado no se genera en la etapa previa al procesador ni inmediatamente después. El preprocesador solo trata con su propio idioma y eso es todo. La optimización ocurre en las etapas de compilación y ensamblaje.
Ignas2526
Es el archivo objeto que obtenemos después de compilar el mismo que el archivo ejecutable en lenguaje máquina. Estoy confundido porque, dijiste que el archivo de objeto se crea en el segundo paso desde el último y el último paso es el archivo ejecutable. Entonces, el archivo .0 que obtenemos después de la compilación, ¿es ese el archivo ejecutable?
AV94
¿No puede ser ejecutable un solo archivo de objeto?
Miel
33

Hay 3 tipos de archivos de objetos.

Archivos de objetos reubicables

Contener el código de máquina en un formulario que se pueda combinar con otros archivos de objetos reubicables en el momento del enlace, para formar un archivo de objetos ejecutable.

Si tiene un a.carchivo fuente, para crear su archivo objeto con GCC debe ejecutar: gcc a.c -c

El proceso completo sería: el preprocesador (cpp) se ejecutaría sobre ac. Su salida (fuente fija) alimentará el compilador (cc1). Su salida (ensamblaje) alimentará al ensamblador (as), que producirá el relocatable object file. Ese archivo contiene código objeto y -gmetadatos de enlace (y depuración si se usó), y no es directamente ejecutable.

Archivos de objetos compartidos

Tipo especial de archivo de objeto reubicable que se puede cargar dinámicamente, ya sea en tiempo de carga o en tiempo de ejecución. Las bibliotecas compartidas son un ejemplo de este tipo de objetos.

Archivos de objeto ejecutable

Contiene código de máquina que se puede cargar directamente en la memoria (por el cargador, por ejemplo, execve ) y ejecutar posteriormente.

El resultado de ejecutar el enlazador sobre múltiples relocatable object fileses un executable object file. El enlazador combina todos los archivos de objetos de entrada de la línea de comando, de izquierda a derecha, fusionando todas las secciones de entrada del mismo tipo (por ejemplo .data) a la sección de salida del mismo tipo. Utiliza symbol resolutiony relocation.

Bonus leído:

Cuando se vincula contra a, static librarylas funciones a las que se hace referencia en los objetos de entrada se copian en el ejecutable final. En dynamic librariessu lugar, se crea una tabla de símbolos que permitirá un enlace dinámico con las funciones / globales de la biblioteca. Por lo tanto, el resultado es un archivo de objeto parcialmente ejecutable, ya que depende de la biblioteca. Si la biblioteca no existe, el archivo ya no puede ejecutarse).

El proceso de vinculación se puede hacer de la siguiente manera: ld a.o -o myexecutable

El comando: gcc a.c -o myexecutableinvocará todos los comandos mencionados en el punto 1 y en el punto 3 (cpp -> cc1 -> as -> ld 1 )

1: en realidad es collect2, que es un contenedor sobre ld.

Paschalis
fuente
11

Un archivo de objeto es justo lo que obtienes cuando compilas uno (o varios) archivo (s) de origen.

Puede ser un archivo ejecutable completo o una biblioteca, o archivos intermedios.

Los archivos de objetos suelen contener código nativo, información de enlace, símbolos de depuración, etc.

Estera
fuente
2

Los archivos de objetos son códigos que dependen de funciones, símbolos y texto para ejecutar el programa. Al igual que las viejas máquinas télex, que requerían teletipo para enviar señales a otras máquinas télex.

De la misma manera que los procesadores requieren un código binario para ejecutarse, los archivos de objetos son como el código binario pero no están vinculados. La vinculación crea archivos adicionales para que el usuario no tenga que compilar el lenguaje C por sí mismo. Los usuarios pueden abrir directamente el archivo exe una vez que el archivo objeto está vinculado con algún compilador como lenguaje c, vb, etc.

Farhan
fuente