O que é um arquivo de objeto em C?

140

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.

Pithikos
fonte
Uma versão mais ativa disso: stackoverflow.com/questions/12122446/…
Ciro Santilli = (

Respostas:

153

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".)

cHao
fonte
Na verdade, com a maioria dos compiladores, a saída da fase de compilação é o código do assembly, e o compilador chama o assembler para transformá-lo em um arquivo de objeto.
22813 Chris Dodd
15
@ ChrisDodd: Esse costumava ser o caso de compiladores mais antigos. Atualmente, um compilador não gera código de montagem, a menos que você solicite, e geralmente não o usa internamente. Mas de qualquer maneira, a montagem seria uma sub-fase da fase de compilação, então tudo isso é discutível.
Chao
2
um único arquivo de objeto pode ser executável?
Querida
1
@ Mel: Geralmente, não. Mesmo se o arquivo de objeto estivesse em um formato projetado para execução (o que basicamente nunca é), essa parte sobre "símbolos necessários para funcionar" basicamente mata o negócio. Até o seu "olá mundo" padrão requer vinculação a uma biblioteca de tempo de execução C.
cHao
74
  1. Um arquivo de objeto é o próprio arquivo compilado. Não há diferença entre os dois.

  2. Um arquivo executável é formado pela vinculação dos arquivos de objeto.

  3. 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.

  4. 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.

RHT
fonte
5
O código otimizado não está sendo gerado no estágio pré-processador nem imediatamente após ele. O pré-processador lida apenas com seu próprio idioma e é isso. A otimização acontece nas etapas de compilação e montagem.
Ignas2526
É o arquivo de objeto que obtemos após compilar o mesmo que o arquivo executável em linguagem de máquina. Estou confuso porque, você disse que o arquivo de objeto é criado no segundo passo, desde o último e o último passo é o arquivo executável. Então, o arquivo .0 que obtemos após a compilação, é o arquivo executável?
AV94 8/09/16
um único arquivo de objeto também não pode ser executável?
Mel
33

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.carquivo 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 -gmetadados 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 resolutione relocation.

Leitura de bônus:

Ao vincular a um, static libraryas funções referenciadas nos objetos de entrada são copiadas para o executável final. Em dynamic librariesvez 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 myexecutableinvocará 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.

Paschalis
fonte
11

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.

Esteira
fonte
2

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.

Farhan
fonte