[[pratica_compilacao]] [appendix] == Usando os Softwares Básicos :cap: tradutor A ferramenta `cc` é um ambiente completo para a compilação, montagem e ligação dos programas de usuário desenvolvidos na linguagem C. Nesta prática iremos identificar cada passo no processo de transformar um código de alto nível (Linguagem C) em um arquivo binário executável. NOTE: O `cc` é um compilador da GNU utilizado principalmente no sistem operacional Linux ou de tipo Unix. Para executá-lo você precisa abrir um terminal e escrever os comandos indicados nesta prática. Você já deve conhecê-lo da disciplina 'Introdução a Programação'. NOTE: Lembre-se de que os códigos fontes do livro estão disponíveis para download e as intruções de como baixá-los estão em <>. Passo 1:: Escreva em qualquer editor de texto os seguintes textos e salve com o nome sugerido para cada arquivo: + -- :srcfile: teste.h .Código fonte {gitrepo}/blob/{edition}/livro/capitulos/code/{cap}/{srcfile}[code/{cap}/{srcfile}] [source, c] ---- include::code/{cap}/{srcfile}[] ---- :srcfile: teste.c .Código fonte {gitrepo}/blob/{edition}/livro/capitulos/code/{cap}/{srcfile}[code/{cap}/{srcfile}] [source, c] ---- include::code/{cap}/{srcfile}[] ---- :srcfile: main.c .Código fonte {gitrepo}/blob/{edition}/livro/capitulos/code/{cap}/{srcfile}[code/{cap}/{srcfile}] [source, c] ---- include::code/{cap}/{srcfile}[] ---- -- Passo 2:: Usar o Compilador do `cc`. Ele irá processar cada arquivo .c e gerar um arquivo .s com o código Assembly respectivo. + _______________ Linguagem Fonte: Linguagem C Linguagem Alvo: Assembly _______________ + Comando:::: `cc -S main.c teste.c` Passo 3:: Usar o montador da aplicação `cc`. Ele irá processar cada arquivo .s e gerar um arquivo .o com o código objeto respectivo. + _______________ Linguagem Fonte: Assembly Linguagem Alvo: Código Objeto _______________ + Comando:::: `cc -c main.s teste.s` + Os passos 2 e 3 geralmente são realizados juntos, para isso basta realizar o seguinte comando: `cc -c main.c teste.c` . Gerando assim um arquivo com Código Objeto (.o) para cada arquivo .c, pulando o código assembly (código intermediário). Passo 4:: Usar o ligador do `cc`. Ele irá processar todos os arquivos .o e ligá-los em um único arquivo binário executável. + _______________ Linguagem Fonte: Código Objeto Linguagem Alvo: Código Binário (Executável) _______________ + Comando:::: `cc main.o teste.o -o exec` + NOTE: `exec` foi o nome dado ao arquivo executável que será gerado pelo ligador do `cc`, logo, você pode escolher qualquer outro nome. Passo 5:: Executar o Código Executável. No linux, para carregar um código executável e colocá-lo em execução basta seguir o seguinte comando: + Comando:::: `./exec` Passo 6:: Modificar o código do arquivo `teste.c`. O propósito desta edição é demonstrar o processo de ligação (<>). + .Editar a implementação da função subtrai. _______________________ Trocar: `return op1 - op2;` Por: `return op1 + op2;` _______________________ + [NOTE] =============== O conteúdo do arquivo `teste.c` ficará igual a: :srcfile: teste_moficado.c [source, c] ---- include::code/{cap}/{srcfile}[] ---- =============== Passo 7:: Compilar apenas o arquivo teste.c Comando:::: `cc -c teste.c` Passo 8:: Ligar os códigos objetos novamente. Comando:::: `cc main.o teste.o -o exec` Passo 9:: Executar o novo Código Executável. Observar a diferença das execuções. Comando:::: ./exec IMPORTANT: Podemos observar a utilidade do software ligador, pois após o *Passo 6* não há necessidade de recompilar todos os códigos fonte, apenas o arquivo `teste.c`, gerando assim um novo arquivo objeto `teste.o` que será ligado ao arquivo `main.o` (arquivo não modificado) formando o novo código executável `exec`. [TIP] =============== Você pode assistir esta prática no seguinte vídeo: .Prática de softwares básicos: http://youtu.be/dVL3XQFNY8o ifdef::livro-pdf[] ["qrcode", size=10, scaledwidth="30%"] ------------------------- http://youtu.be/dVL3XQFNY8o ------------------------- endif::livro-pdf[] ifdef::livro-html[] +++ +++ endif::livro-html[] =============== // Sempre terminar o arquivo com uma nova linha.