Existem 3 tipos de arquivos de objeto.
Arquivos de objeto realocáveis
Contenha o código da máquina em um formulário que possa ser combinado com outros arquivos de objetos realocáveis no momento do link, para formar um arquivo de objeto executável.
Se você possui um a.c
arquivo de origem, para criar seu arquivo de objeto com o GCC, execute:
gcc a.c -c
O processo completo seria: o pré-processador (cpp) seria executado em ac Sua saída (fonte estática) será alimentada no compilador (cc1). Sua saída (montagem) será alimentada no montador (as), que produzirá o relocatable object file
. Esse arquivo contém código de objeto e -g
metadados de vinculação (e depuração, se usado) e não é diretamente executável.
Arquivos de Objetos Compartilhados
Tipo especial de arquivo de objeto realocável que pode ser carregado dinamicamente, no tempo de carregamento ou no tempo de execução. Bibliotecas compartilhadas são um exemplo desses tipos de objetos.
Arquivos de objeto executável
Contém código de máquina que pode ser carregado diretamente na memória (pelo carregador, por exemplo, execve ) e subsequentemente executado.
O resultado da execução do vinculador sobre vários relocatable object files
é um executable object file
. O vinculador mescla todos os arquivos do objeto de entrada da linha de comando, da esquerda para a direita, mesclando todas as seções de entrada do mesmo tipo (por exemplo .data
) na seção de saída do mesmo tipo. Ele usa symbol resolution
e relocation
.
Leitura de bônus:
Ao vincular a um, static library
as funções referenciadas nos objetos de entrada são copiadas para o executável final. Em dynamic libraries
vez disso, é criada uma tabela de símbolos que permitirá um vínculo dinâmico com as funções / globais da biblioteca. Portanto, o resultado é um arquivo de objeto parcialmente executável, pois depende da biblioteca. Se a biblioteca não existir, o arquivo não poderá mais ser executado).
O processo de vinculação pode ser feito da seguinte maneira:
ld a.o -o myexecutable
O comando: gcc a.c -o myexecutable
invocará todos os comandos mencionados no ponto 1 e no ponto 3 (cpp -> cc1 -> as -> ld 1 )
1: na verdade é collect2, que é um wrapper sobre ld.