Explicação detalhada dos quatro processos de compilação do GCC


Pré-processamento: sem verificação de erros, substituição de arquivo de cabeçalho, remoção de comentários, compilação condicional

gcc -E hello.c -o hello.i

(1) Exclua todos os #defines e expanda todas as definições de macro. Para ser franco, é uma substituição de personagem.

(2) Processar todas as instruções de compilação condicional (pré-compilação), #ifdef #ifndef #endif, etc., ou seja, aquelas com #.

(3) Na declaração condicional, aqueles que atenderem às condições de julgamento serão retidos e aqueles que não o fizerem serão excluídos.

(3) Processe a diretiva pré-compilada #include e insira o arquivo apontado por #include nesta linha (a localização da diretiva pré-compilada).

(4) Exclua todos os comentários.

(5) Adicione o número da linha e o rótulo do arquivo, para que você possa saber qual linha do arquivo está ao depurar e compilar erros, o que é conveniente para depuração.

(6) Mantenha as diretivas do compilador #pragma, pois o compilador precisa usá-las.

(7) Gerar (.i) arquivos temporários (incluindo descommentação, substituição de macro, expansão de arquivo de cabeçalho e compilação condicional).O arquivo compilado não contém nenhuma definição de macro, porque a macro foi expandida e o arquivo incluído foi inserido em arquivo .i.


Compilação: verificação de erros A essência da geração de arquivos assembly é compilar linguagem de alto nível em linguagem assembly reconhecível por máquina

gcc -S hello.i -o hello.s

(1) Verificação, análise de sintaxe, análise semântica, análise de código-fonte, geração de código objeto e otimização de código objeto.

(2) Gere código assembly.

(3) Símbolos de resumo.

(4) Gere o arquivo .s.


Assembly: Gere arquivos binários a partir de arquivos assembly

gcc -c hello.s -o hello.o

(1) Traduza as instruções de montagem em formato binário de acordo com as instruções de montagem e plataformas específicas.

(2) Mesclar cada seção e mesclar a tabela de símbolos.

(3) Gere arquivos .o.


Vinculação: Gere arquivos binários em arquivos executáveis

gcc hello.o -o hello

(1) O vinculador vincula o arquivo objeto com os arquivos objeto adicionais necessários (como biblioteca de link estático, biblioteca de link dinâmico) para se tornar um arquivo executável.

(2) Mesclar as seções de cada arquivo .obj, mesclar a tabela de símbolos e realizar a análise de símbolos.

(3) Realocação de endereço de símbolo.

(4) Gere arquivos executáveis.

Acho que você gosta

Origin blog.csdn.net/FLM19990626/article/details/129631696
Recomendado
Clasificación