Estou lendo sobre bibliotecas em C, mas ainda não encontrei uma explicação sobre o que é um arquivo de objeto. Qual é a diferença real entre qualquer outro arquivo compilado e um arquivo de objeto?
Eu ficaria feliz se alguém pudesse explicar em linguagem humana.
c
compilation
linker
object-files
Pithikos
fonte
fonte
Respostas:
Um arquivo de objeto é a saída real da fase de compilação. É principalmente código de máquina, mas possui informações que permitem que um vinculador veja quais símbolos estão nele e também os símbolos necessários para funcionar. (Para referência, "símbolos" são basicamente nomes de objetos globais, funções etc.)
Um vinculador pega todos esses arquivos de objeto e os combina para formar um executável (assumindo que pode, ou seja: que não haja símbolos duplicados ou indefinidos). Muitos compiladores farão isso por você (leia-se: eles executam o vinculador por conta própria) se você não lhes disser para "apenas compilar" usando as opções da linha de comando. (
-c
é uma opção comum "apenas compile; não vincule".)fonte
Um arquivo de objeto é o próprio arquivo compilado. Não há diferença entre os dois.
Um arquivo executável é formado pela vinculação dos arquivos de objeto.
O arquivo de objeto contém instruções de baixo nível que podem ser entendidas pela CPU. É por isso que também é chamado de código de máquina.
Esse código de máquina de baixo nível é a representação binária das instruções que você também pode escrever diretamente usando a linguagem assembly e, em seguida, processar o código da linguagem assembly (representado em inglês) no idioma da máquina (representado em Hex) usando um assembler.
Aqui está um fluxo típico de alto nível para esse processo para código em linguagem de alto nível, como C
-> passa pelo pré-processador
-> para fornecer código otimizado, ainda em C
-> passa pelo compilador
-> para fornecer código de montagem
-> passa por um montador
-> para fornecer código na linguagem de máquina que é armazenada em ARQUIVOS DE OBJETO
-> passa pelo Linker
-> para obter um arquivo executável.
Esse fluxo pode ter algumas variações, por exemplo, a maioria dos compiladores pode gerar diretamente o código da linguagem de máquina, sem passar por um montador. Da mesma forma, eles podem fazer o pré-processamento para você. Ainda assim, é bom separar os constituintes para uma melhor compreensão.
fonte
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
é umexecutable 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 usasymbol resolution
erelocation
.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. Emdynamic 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.
fonte
Um arquivo de objeto é exatamente o que você obtém quando compila um (ou vários) arquivos de origem.
Pode ser um executável completo ou uma biblioteca ou arquivos intermediários.
Os arquivos de objeto geralmente contêm código nativo, informações do vinculador, símbolos de depuração e assim por diante.
fonte
Arquivos de objeto são códigos que dependem de funções, símbolos e texto para executar o programa. Assim como as máquinas de telex antigas, que exigiam teletransporte para enviar sinais para outra máquina de telex.
Da mesma forma que os processadores exigem código binário para serem executados, os arquivos de objetos são como código binário, mas não estão vinculados. A vinculação cria arquivos adicionais para que o usuário não precise compilar o idioma C. Os usuários podem abrir diretamente o arquivo exe quando o arquivo do objeto estiver vinculado a algum compilador como o idioma c ou vb etc.
fonte