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.
c
compilation
linker
object-files
Pithikos
fuente
fuente
Respuestas:
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. (
-c
es una opción común de "solo compilar; no vincular").fuente
Un archivo Object es el archivo compilado en sí. No hay diferencia entre los dos.
Un archivo ejecutable se forma al vincular los archivos Object.
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.
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.
fuente
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.c
archivo 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-g
metadatos 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 files
es unexecutable 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. Utilizasymbol resolution
yrelocation
.Bonus leído:
Cuando se vincula contra a,
static library
las funciones a las que se hace referencia en los objetos de entrada se copian en el ejecutable final. Endynamic libraries
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 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 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.
fuente
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.
fuente
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.
fuente