Wstęp Przepisać poniższy kod do edytora tekstowego i zapisać pod

Transkrypt

Wstęp Przepisać poniższy kod do edytora tekstowego i zapisać pod
Wstęp
Przepisać poniższy kod do edytora tekstowego i zapisać pod nazwą hello.c :
#include <stdio.h>
#define A 1
//Dyrektywa dla preprocesora
//Pierwszy komentarz
int main()
{
#ifdef A
printf(„Hello World\n”);
#else
printf(„World Hello\n”);
#endif
return 0;
}
Skompilować kod za pomocą komendy gcc hello.c -o hello . Wykonać za pomoca komendy ./hello
Preprocessing
Uruchomić gcc z powyższym programem za pomocą komendy (powoduje zatrzymanie na etapie
preprocessingu)
gcc -E hello.c > hello1.i
Obejrzeć wynik za pomocą komendy
less hello1.i
Zakomentować 3 linijkę programu z dyrektywą #define. Uruchomić gcc jak w poprzednim kroku:
gcc -E hello.c > hello2.i
Zaobserwować zmiany w stosunku do poprzedniego wywołania. Co się stało z komentarzami?
Kompilacja do assemblera
Uruchomić gcc z powyższym programem za pomocą komendy (powoduje zatrzymanie na etapie
kompilacji do kodu assemblera)
gcc -S hello.c
Optymalizacja
Uruchomić gcc z powyższym programem za pomocą komend:
gcc
gcc
gcc
gcc
-O1
-O2
-O3
-Os
-S
-S
-S
-S
hello.c
hello.c
hello.c
hello.c
Zaobserwować, że kompilacja z różnymi parametrami optymalizacyjnymi wpływa na strukturę
pośredniego kodu assemblera.
Asemblacja
Uruchomić gcc z powyższym programem za pomocą komendy:
gcc -c hello.c -o hello.o
Wywołanie tej opcji powoduje przetworzenie kodu programu do kodu assemblera a następnie na
kod maszynowy, zapisany w pliku z rozszerzeniem '.o'. Nie jest to jeszcze finalny kod
wykonywalny. Aby go otrzymać, należy uruchomić gcc z opcją:
gcc hello.o -o hello
W ten sposób możliwe jest już wykonanie programu za pomocą wywołania ./hello.
Inną możliwością przetworzenia kodu assemblera na kod maszynowy jest wykorzystanie komend:
gcc -S hello.c
as hello.s -o hello.o
gcc hello.o -o hello
//Do kodu assemblera
//Wywołanie assemblera
//Do kodu binarnego
Konsolidacja / Linkowanie
Ostatnim etapem kompilacji jest wykorzystanie mechanizmu konsolidacji. Do zaobserwowania tego
mechanizmu należy zmodyfikować pierwszy program w następujący sposób:
(plik hello.c):
#include <stdio.h>
#define A 1
//Dyrektywa dla preprocessora
//Pierwszy komentarz
int main()
{
#ifdef A
printf(„Hello World\n”);
#else
printf(„World Hello\n”);
#endif
print();
//Zewnętrzna metoda
return 0;
}
Następnie należy utworzyć nowy plik print.c:
#include <stdio.h>
void print()
{
printf(„Hello from print method”);
}
Następnie należy wywołać poniższe polecenia:
gcc -c print.c -o print.o
gcc -c hello.c -o hello.o
Próba wywołania poniższego polecenia zakończy się błędem (dlaczego?):
gcc hello.o -o hello
Dla poprawnej konsolidacji należy wywołać gcc w poniższy sposób:
gcc hello.o print.o -o hello
Co daje rozłożenie programu na poszczególne moduły ?