Saltar al contenido

¿Qué es un archivo de objeto en C?

Solución:

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

Un enlazador toma todos estos archivos de objeto y los combina para formar un ejecutable (asumiendo que puede, es decir, que no hay símbolos duplicados o indefinidos). Muchos compiladores harán esto por usted (léase: ejecutan el enlazador por su cuenta) si no les dice que “compilen” usando las opciones de la línea de comandos. (-c es una opción común “simplemente compilar; no vincular”).

  1. Un archivo de objeto es el propio archivo compilado. No hay diferencia entre los dos.

  2. Un archivo ejecutable se forma al vincular los archivos de objeto.

  3. El archivo de objeto contiene instrucciones de bajo nivel que pueden ser entendidas por la CPU. Por eso también se le llama código 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 lenguaje ensamblador y luego procesar el código de lenguaje ensamblador (representado en inglés) en lenguaje de máquina (representado en Hex) usando un ensamblador.

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

-> pasa por el preprocesador

-> para dar código optimizado, todavía en C

-> pasa por el compilador

-> dar código ensamblador

-> 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 en lenguaje máquina, sin pasar por un ensamblador. Del mismo modo, pueden realizar el procesamiento previo por usted. Aún así, es bueno dividir los componentes para una mejor comprensión.

Hay 3 tipos de archivos de objetos.

Archivos de objetos reubicables

Contiene código de máquina en una forma que se puede combinar con otros archivos de objeto reubicables en el momento del enlace, para formar un archivo de objeto ejecutable.

Si tienes un a.c archivo de origen, para crear su archivo de objeto con GCC debe ejecutar:
gcc a.c -c

El proceso completo sería: el preprocesador (cpp) se ejecutaría sobre ac Su salida (todavía fuente) se alimentará al compilador (cc1). Su salida (ensamblaje) se alimentará al ensamblador (as), que producirá el relocatable object file. Ese archivo contiene código de objeto y vinculación (y depuración si -g se utilizó) metadatos 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 objetos ejecutables

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

El resultado de ejecutar el vinculador en varios relocatable object files es un executable object file. El enlazador fusiona todos los archivos de objeto de entrada de la línea de comando, de izquierda a derecha, fusionando todas las secciones de entrada del mismo tipo (p. Ej. .data) a la sección de salida del mismo tipo. Usa symbol resolution y relocation.

Bonificación de lectura:

Al vincular contra un static library las funciones a las que se hace referencia en los objetos de entrada se copian en el ejecutable final. Con dynamic libraries en su 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 objeto parcialmente ejecutable, ya que depende de la biblioteca. Si la biblioteca no existe, el archivo ya no se puede ejecutar).

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

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

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

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *