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.