RobL escreveu:Muito bom o assunto e bem escrito. Valeu.
Detalhe pequeno, um trecho para mim está um pouco confuso, mas pode ser minha leitura.
Na sequencia do seu texto, temos:
O GNU Assembler, as, é o compilador responsável por gerar um arquivo-objeto relocatable a partir de um arquivo-fonte em Assembly.
Por definição de compilador e linkeditor temos:
Ao final da compilação temos o código objeto
Após a linkedição (Ligador ou o não aceito "linkador") temos o executável, ou seja, o trabalho do "compilador" terminou antes.
Para mim ficou confuso o uso : - as, é o compilador ...
Muito bom trabalho.
RobL,
O compilador é reponsável por converter um código escrito numa linguagem num outro código escrito numa outra linguagem. No caso, temos dois compiladores:
- compilador C: converte código na linguagem C para um código de máquina (arquivo-objeto);
- compilador Assembly: converte código na linguagem Assembly de uma arquitetura para um código de máquina da mesma arquitetura (arquivo-objeto).
Na etapa final de compilação de um código C, assim como para as outras linguagens compiladas, é gerado código Assembly correspondente. Nesse momento o compilador C deve fazer uma nova compilação para gerar um arquivo-objeto. Ou o mesmo usa a sua própria implementação de compilador Assembly, ou usa um compilador já existente.
Essa última opção é a escolha do gcc! Ele usa o compilador GNU AS, que vem incluído no pacote GNU Binutils.
Então, a sequência fica, dado um arquivo em código C:
1) pré-processamento (executável cpp)
2) compilação C -> Assembly (executável cc1)
3) compilação Assembly -> código de máquina, arquivo-objeto (executável as)
Pronto! Temos um arquivo-objeto. Mas como criar um executável final? Usa o linker para "juntar" todos os arquivos-objeto gerados. O executável que faz isso é o collect2 (front-end do ld). Só que o compilador gcc faz todas essas chamadas!! Testa a opção de compilação -v (verbose)!
Como está no blog, a chamada abaixo faz tudo isso!
$ cross-gcc main.c startup.o vetor_de_interrupcoes.o -o main
Entendo a sua dúvida...é que o gcc esconde essas etapas, mas como disse no blog, podemos ver a saída de cada uma delas!
Agradeço muito os elogios e espero ter esclarecido a sua dúvida!
Abs,