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 ?