INF1612 - Software Básico

Aulas de Laboratório

Compilação e link-edição

  1. Considere o programa formado pelos dois arquivos abaixo:

    Compile, ligue e execute esse programa, seguindo os passos abaixo:
    > gcc -c -Wall temp1.c
    > gcc -c -Wall temp2.c
    > gcc -o prog  temp1.o temp2.o
    
    (Você pode fazer tudo de uma só vez chamando gcc -Wall temp1.c temp2.c, mas aí o gcc não gera os arquivos .o.) Explique a saída do programa.
  2. Use o programa nm para inspecionar os símbolos usados por cada módulo (chame nm temp1.o e nm temp2.o). Você consegue inferir o significado das letras que aparecem na saída deste programa (U, T, etc.)?

  3. Se no 2o arquivo trocarmos a linha extern char a; por char a = 0;, o que acontece? Como o erro foi detectado? E se a troca for por static char a = 0;, o que acontece?

  4. De volta aos arquivos originais, o que ocorre se trocarmos, no 1o arquivo, a linha foo(); por b();? Explique.

  5. Escreva dois arquivos temp1.h e temp2.h, a serem incluídos tanto por temp1.c quanto por temp2.c, que evitem os problemas que criamos nos itens anteriores. ("Evitar os problemas" significa que, ao invés de erros de execução sem sentido, teremos erros de compilação mais bem documentados se fizermos algo errado.) Refaça os erros anteriores e descreva o que ocorre agora que temos os .h.