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 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 resolution
y relocation
.
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. En dynamic 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.