programa proceso ejecutar compilar compilador compilacion como c compilation linker object-files

proceso - ¿Qué es un archivo objeto en C?



gcc linux (5)

  1. Un archivo de objeto es el archivo compilado en sí mismo. 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. 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 utilizando el lenguaje ensamblador y luego procesar el código del lenguaje ensamblador (representado en inglés) en el lenguaje de la máquina (representado en hexadecimal) utilizando un ensamblador.

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

-> pasa por el pre-procesador

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

-> pasa por el compilador

-> dar el 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 la máquina, sin pasar por un ensamblador. Del mismo modo, pueden hacer el preprocesamiento por usted. Aún así, es bueno separar los componentes para una mejor comprensión.

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


Código de objeto son códigos tat que dependen de funciones, símbolos, texto para ejecutar la máquina. Al igual que las antiguas máquinas télex que requieren teletipo para enviar señales a otra máquina télex. De la misma manera, el procesador requiere código binario para ejecutar la máquina. El archivo de objeto es como un código binario pero no está vinculado. El enlace crea archivos adicionales para que el usuario no tenga que tener un compilador como el lenguaje c. El usuario puede abrir directamente el archivo exe una vez que el archivo objeto está vinculado con algún compilador como el lenguaje c, o vb, etc.


Hay 3 tipos de archivos de objetos.

Archivos de objeto reubicables

Contienen código de máquina en un formulario que se puede combinar con otros archivos de objeto reubicables en tiempo de enlace, para formar un archivo de objeto ejecutable.

Si tiene un archivo fuente de ac , para crear su archivo de objeto con GCC debe ejecutar: gcc ac -c

El proceso completo sería: el preprocesador (cpp) se ejecutará sobre ac Su salida (fuente fija) se introducirá en el compilador (cc1). Su salida (ensamblado) se alimentará al ensamblador (as), lo que producirá el relocatable object file . Ese archivo contiene código de objeto y metadatos de enlace (y puede depurar si se usó -g ), 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 este tipo de objetos.

Archivos de objetos ejecutables

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

El resultado de ejecutar el enlazador sobre múltiples relocatable object files es un executable object file . El enlazador fusiona todos los archivos del objeto de entrada desde la línea de comando, de izquierda a derecha, fusionando todas las secciones de entrada del mismo tipo (por ejemplo, datos) en la sección de salida del mismo tipo. Utiliza symbol resolution y relocation .

Prima:

Al vincular con una 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 habilitará 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. (en palabras simples, si la biblioteca se ha ido, el archivo ya no se puede ejecutar).

El proceso de enlace se puede hacer de la siguiente manera: ld ao -o myexecutable

El comando: gcc ac -o myexecutable invocará 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.


Un archivo objeto es justo lo que obtiene cuando compila uno (o varios) archivos fuente.

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

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


Un archivo de objeto es el resultado real de la fase de compilación. En su mayoría es un código de máquina, pero tiene información que le permite a un vinculador ver qué símbolos contiene, así como los símbolos que requiere para poder trabajar. (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 (suponiendo que pueda, es decir: que no haya ningún símbolo duplicado o indefinido). Muchos compiladores harán esto por usted (léase: ejecutan el vinculador 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 de "solo compilar; no vincular").