Página 1 de 1

Processo de build usando GNU Toolchain

MensagemEnviado: 17 Jul 2012 16:00
por uCTato
Pessoal,

Escrevi um post no meu blog sobre o "Processo de build usando GNU Toolchain" para sistemas bare-metal.

http://henriqueprossi.wordpress.com/201 ... toolchain/

Espero que gostem!!

abs,

Henrique P. Rossi
henriqueprossi.wordpress.com

MensagemEnviado: 19 Jul 2012 22:42
por RobL
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.

Processo de build usando GNU Toolchain

MensagemEnviado: 19 Jul 2012 23:19
por uCTato
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,

MensagemEnviado: 20 Jul 2012 09:02
por fabim
nossa, eu achava que:
Compilador C, era um makro que ajeitava o script C, em um scriptC conforme opções e gerava um arquivo LST e um ASM-ARM.
Compilador ASM, pegava o ASM-ARM que é o OBJET ASM, e gerava o HEX e o OBJET CODE.

Não sabia que compilador C hoje em dia estava tão mais completo.

Estranho

MensagemEnviado: 20 Jul 2012 09:56
por tcpipchip
Compilador assembly ?

MensagemEnviado: 20 Jul 2012 10:21
por RobL
A dúvida é meramente acadêmica em termos de definição:
Sem pedantismo, compilar seria partir do código fonte fazer verificação (análise léxica, sintática e semântica), é gerado um código intermediário e são construídas tabelas de símbolos, alocam-se as áreas de memória para variáveis e atribui-se os registradores a serem utilizados, e é finalmente gerado o código objeto em linguagem binária de máquina.

Porém, há compiladores que geram o assembly e daí para frente visto que não há o trabalho acima, tem o nome de montador.
O montador somente verifica se a instrução está correta e seus campos e gera a correspondente linguagem de máquina.

Mesmo no compilador que não gera o assembly, esta etapa foi apenas suprimida por ser desnecessária, mas o último estágio é similar ao do montador.

Portanto chamar um montador de compilador é uma extensão linguística conotativa e não denotativa. Mas se o povo está chamando assim, passa a ser correto, contanto que saibamos que o "compilador" assembly, não faz o que faz um compilador para linguagem de alto nível.
Por outro lado, o sinal linguístico compilador, está associado a linguagens de alto nível. O assembly, não possui as propriedades linguísticas a ponto de ser compilado.

Por que isso tudo, só para encher o saco ?
Absolutamente não. Veja na prática: Se alguém me coloca que está com um erro de compilação. O termo compilação nos mostra que temos muito a pesquisar, como sintática, semântica etc, pode ser bastante complexo e até difícil. Mas se o cara diz: deu um erro no assembler, lhe digo, veja se a instrução, ou se os campos estão corretos e só. A solução está em um conjunto bem mais simples.

Quero agradecer mais uma vez seu bom trabalho, o qual precisamos muito.

MensagemEnviado: 20 Jul 2012 11:40
por fabim
RobL escreveu:A dúvida é meramente acadêmica em termos de definição:
Sem pedantismo, compilar seria partir do código fonte fazer verificação (análise léxica, sintática e semântica), é gerado um código intermediário e são construídas tabelas de símbolos, alocam-se as áreas de memória para variáveis e atribui-se os registradores a serem utilizados, e é finalmente gerado o código objeto em linguagem binária de máquina.

Porém, há compiladores que geram o assembly e daí para frente visto que não há o trabalho acima, tem o nome de montador.
O montador somente verifica se a instrução está correta e seus campos e gera a correspondente linguagem de máquina.

Mesmo no compilador que não gera o assembly, esta etapa foi apenas suprimida por ser desnecessária, mas o último estágio é similar ao do montador.

Portanto chamar um montador de compilador é uma extensão linguística conotativa e não denotativa. Mas se o povo está chamando assim, passa a ser correto, contanto que saibamos que o "compilador" assembly, não faz o que faz um compilador para linguagem de alto nível.
Por outro lado, o sinal linguístico compilador, está associado a linguagens de alto nível. O assembly, não possui as propriedades linguísticas a ponto de ser compilado.

Por que isso tudo, só para encher o saco ?
Absolutamente não. Veja na prática: Se alguém me coloca que está com um erro de compilação. O termo compilação nos mostra que temos muito a pesquisar, como sintática, semântica etc, pode ser bastante complexo e até difícil. Mas se o cara diz: deu um erro no assembler, lhe digo, veja se a instrução, ou se os campos estão corretos e só. A solução está em um conjunto bem mais simples.

Quero agradecer mais uma vez seu bom trabalho, o qual precisamos muito.


Legal RobL, exatamente o que eu pensava, desde a epoca do MPLAB com o COMPILADOR/MONTADOR MPASM.
Se você observar, tinha um negócio legal, que o plugin do C18 gerava um LST, e um ASM. No final dessa COMPILAÇÃO ele invocava o MPASM para gerar o HEX.

parabéns novamente !!

MensagemEnviado: 20 Jul 2012 21:29
por uCTato
tcpipchip escreveu:Compilador assembly ?


Usei uma nomenclatura errada, mas para fins didáticos. É um assembler, e não um compilador. Podemos considerar que os GNU AS é um "compilador" de uma linguagem de segunda geração, abaixo das linguagens de terceira geração (C, C++, Java, Cobol, Lisp, etc), sendo que cada mnemônico em assembly equivale a um opcode da máquina correspondente.

Abs,

MensagemEnviado: 20 Jul 2012 21:47
por uCTato
RobL escreveu:A dúvida é meramente acadêmica em termos de definição:
Sem pedantismo, compilar seria partir do código fonte fazer verificação (análise léxica, sintática e semântica), é gerado um código intermediário e são construídas tabelas de símbolos, alocam-se as áreas de memória para variáveis e atribui-se os registradores a serem utilizados, e é finalmente gerado o código objeto em linguagem binária de máquina.

Porém, há compiladores que geram o assembly e daí para frente visto que não há o trabalho acima, tem o nome de montador.
O montador somente verifica se a instrução está correta e seus campos e gera a correspondente linguagem de máquina.

Mesmo no compilador que não gera o assembly, esta etapa foi apenas suprimida por ser desnecessária, mas o último estágio é similar ao do montador.

Portanto chamar um montador de compilador é uma extensão linguística conotativa e não denotativa. Mas se o povo está chamando assim, passa a ser correto, contanto que saibamos que o "compilador" assembly, não faz o que faz um compilador para linguagem de alto nível.
Por outro lado, o sinal linguístico compilador, está associado a linguagens de alto nível. O assembly, não possui as propriedades linguísticas a ponto de ser compilado.

Por que isso tudo, só para encher o saco ?
Absolutamente não. Veja na prática: Se alguém me coloca que está com um erro de compilação. O termo compilação nos mostra que temos muito a pesquisar, como sintática, semântica etc, pode ser bastante complexo e até difícil. Mas se o cara diz: deu um erro no assembler, lhe digo, veja se a instrução, ou se os campos estão corretos e só. A solução está em um conjunto bem mais simples.

Quero agradecer mais uma vez seu bom trabalho, o qual precisamos muito.


Concordo!! Usei uma nomenclatura errada, mas para fins didáticos. É um assembler, e não um compilador. Podemos considerar que os GNU AS é um "compilador" de uma linguagem de segunda geração, abaixo das linguagens de terceira geração (C, C++, Java, Cobol, Lisp, etc), sendo que cada mnemônico em assembly equivale a um opcode da máquina correspondente.

Inclusive não menciono mais "compilador assembly" no post, usei somente assembler!

Pessoal, obrigado pelo feedback!

Abs,

MensagemEnviado: 20 Jul 2012 22:21
por uCTato
fabim escreveu:nossa, eu achava que:
Compilador C, era um makro que ajeitava o script C, em um scriptC conforme opções e gerava um arquivo LST e um ASM-ARM.
Compilador ASM, pegava o ASM-ARM que é o OBJET ASM, e gerava o HEX e o OBJET CODE.

Não sabia que compilador C hoje em dia estava tão mais completo.

Estranho


O que eu quis dizer é que o executável gcc realiza todas as chamadas necessárias, inclusive para o back-end assembler (as). O compilador C (cc1) só gera o código em assembly.

No texto anterior, quando mencionei compilador C, entenda-se que o arquivo em código assembly é gerado, e não o arquivo-objeto final. Foi typo :)

Obrigado pelo retorno!

Abs,