background image

Grupa 12K2  

Rafał Linca   6.I.2010 

Ćwiczenie Laboratoryjne 11 

Sprawozdanie 

Sprawozdanie 

1.  

Wstęp 

 

Celem laboratorium było zapoznanie się z podstawowymi narzędziami 

służącymi do kompilacji programów napisanych w języku C. 
 
 
2.  Przebieg 
 
 

Przed przystąpieniem do ćwiczenia konieczne było doinstalowanie 

kompilatora GCC. Należało więc wykonać polecenie: 
 

yum install gcc 

 

 

Pierwszym zadaniem było przygotowanie kodu źródłowego w pliku licz0.c przy 

użyciu edytora vim, do którego wpisaliśmy następującą treść: 

 

#include<stdio.h> 

double kwadrat(double x) 

return (x)*(x); 

int main(int argc, char* argv[]) 

double liczba, kw_liczby; 

printf("Podaj liczbe: "); 

10 

scanf("%lf", &liczba); 

11 

kw_liczby=kwadrat(liczba); 

12 

printf("Jej kwadrat to: %lf\n", kw_liczby); 

13 

return 0; 

14 

 
N

astępnie musieliśmy skompilować pliki źródłowe C przy użyciu GCC: 

 
gcc –o <nazwa_pliku_wykonywalnego> <nazwa_pliku_źródłowego_c> 
 
Kolejny program wygląda następująco: 
 
licz1.c: 

#include<stdio.h> 

double kwadrat(double x); 

double szescian(double x); 

int dodaj(int a, int b); 

void powitaj(char* dopisek); 

int main(int argc, char* argv[]) 

background image

double liczba, kw_liczby; 

powitaj("matematyki"); 

10 

printf("Podaj liczbę: "); 

11 

scanf("%lf", &liczba); 

12 

kw_liczby=kwadrat(liczba); 

13 

printf("Jej kwadrat to %lf\n", kw_liczby); 

14 

return 0; 

15 

 
funkcje.c: 

double kwadrat(double x) 

return (x)*(x); 

powitanie.c: 

#include<stdio.h> 

void powitaj(char* dopisek) 

printf("Witaj w swiecie %s\n", dopisek); 

10 

 
Należało w tym przypadku połączyć (scalić) dwa pliki .c: 
gcc – o <licz1.c>.exe  <funkcje.c>.o <powitanie.c>.o 
 
Polecenie make stosowane jest jeśli chcemy wyszukać w bieżącym katalogu pliku 
tekstowego o nazwie „makefile” lub „Makefile”. Przykładowy plik Makefile: 
 

CC = gcc 

CFLAGS = -O1 

Licz1.exe : licz1.o funkcje.o powitanie.o 

$(CC) $(CFLAGS) -o $@ $? 

liczh.o : licz1.c 

$(CC) $(CFLAGS) -c $? 

funkcje.o : funkcje.c 

$(CC) $(CFLAGS) -c $? 

powitanie.o : powitanie.c 

10 

$(CC) $(CFLAGS) -c $? 

11 

clean: 

12 

rm *.o 

 
Wybrane zmienne stosowane w plikach makefile
$@ -symboliczna nazwa pliku celu w regule 
$* -

rdzeń nazwy pliku (bez rozszerzenia po kropce) 

$< -

nazwa pliku pierwszej zależności od reguły 

$^ -

lista wszystkich zależności w regule 

$? - 

lista zależności nowszych niż cel 

Zmienne lokalne w plikach „make” są przypisywane różnym poleceniom na początku 
skryptu. 
 
Wy

brane opcje polecenia “make” (nie muszą występować): 

-

n : polecenia są składane i wyświetlane, ale nie wykonywane (dobre do testów) 

background image

-

I <katalog> : katalog do poszukiwania plików make poza katalogiem bieżącym (duże 

'i') 
-s : (silent) make nie wypisuje polec

eń na ekranie 

-

f <plik> : nazwa pliku make inna niż „makefile” lub „Makefile” 

-

k : nie przerywa działania jeśli nie uda się zbudować jednego z celów 

-

d : (debug) wyświetlane są informacje debugowania 

-

W<plik> : wykonuje się tak jakby wymieniony plik był zmodyfikowany (do testowania) 

 
Ponadto nauczyliśmy się gdzie znajduje się jądro systemu Linux oraz w jaki sposób 
się je aktualizuje. 
 
3. Wnioski: 
 
Linux wyposażony w kompilator gcc daje użytkownikowi systemu prostą i 
uniwersalną alternatywę dla środowisk programowania. Dzięki niemu możliwa jest 
także modyfikacja poszczególnych narzędzi naszego systemu łącznie z samym 
jądrem. 
 
4. Kompilacja jądra systemu (dodatkowo) 
 

Po co kompilować jądro? 

Istnieje wiele powodów, dla których ludzie kompilują jądra. Jednym z najczęstszych 
to po prostu chęć uaktualnienia swojego systemu. Linux jest bardzo szybko 
rozwijającym się systemem, w związku z tym dość często pojawiają się nowe wersje 
jąder. Należy jednak pamiętać, że tylko jądra z parzystą środkową liczbą wersji są 
uznawane za stabilne. Jądra z nieparzystą liczbą to tzw. jądra rozwojowe 
wprowadzające nowe features, które będą wbudowane kiedyś (po przetestowaniu) 
do serii stabilnej. 

Inny powód samodzielnej kompilacji to chęć posiadania jądra systemu doskonale 
dopasowanego do potrzeb konkretnego użytkownika. Można tak skonfigurować 
jądro, aby miało wbudowane tylko sterowniki tych urządzeń, które posiadamy, tylko 
tych systemów plików, z którymi mamy do czynienia. 

Jak to się robi? 

Po pierwsze musimy 

zdobyć źródła jądra. Oprócz oczywistej możliwości ściągnięcia 

ich z sieci, można je wziąć z każdej dystrybucji. 

Zdobyty plik tar.gz o nazwie np. linux-

2.0.33.tar.gz i rozmiarach około 7MB do 9MB 

należy rozpakować w katalogu /usr/src tak, aby powstał tam 
katalog linux 

zawierający źródła. 

Następnie musimy skonfigurować instalację. Będąc w katalogu /usr/src/linux i będąc 
oczywiście zalogowanym jako root piszemy: 

 

make config - s

krypt konfiguracyjny odpali się na konsoli 

 

make menuconfig - wygodna konfiguracja z menu 

background image

 

make xconfig - uruchamia 

konfigurację w X 

Pytania zadawane przez skrypt konfiguracyjny są na tyle oczywiste, że chyba nie 
potrzeba przy tym zaawansownej wiedzy 

i doświadczenia. Następnie należy 

s

tworzyć zależności: 

make dep 

...i rozpocząć kompilację.... 

make zImage 

Zwracamy 

uwagę na duże i małe litery w słowie zImage. Następnie po około 10 

minutach 

(w zależności od szybkości procesora) jeśli konfigurowaliśmy jądro jako 

modularne, musimy 

skompilować moduły oraz zainstalować je: 

make modules 
make modules_install 

Stare moduły siedzące w /lib/modules/numer.starego.jądra/ możemy 
potem usunąć, ale na razie zainstalujmy jądro. Jest w jednym podkatalogu 
źródeł /arch/i386/boot i nazywa się zImage. Teraz należy dowiedzieć się, gdzie 
lilo 

szuka jądra. Jest to napisane w /etc/lilo.conf. Najpierw robimy kopię 

zapasową poprzedniego działającego jądra w katalogu odszukanym w powyższym 
pliku (np. cp vmlinuz vmlinuz-old) i dopiero po zrobieniu kopii nagrywamy do 
tego katalogu nasze 

jądro. Następnie edytujemy powyższy plik i robimy kopię akapitu 

opisującego nasze jądro i wpisujemy label=old i zmieniamy tam  vmlinuz   na  
vmlinuz-old. Jes

t taka zasada, że nazywamy jądro vmlinuz-x.y.z. Po tych 

modyfikacjach koniecznie wykonujemy 

lilo 

Następnie rebootujemy komputer. Jeśli coś nie poszło, to można zresetować i 
przy lilo: 

wpisać old co wystartuje nam poprzednią wersję jądra. 

 

Wiadomości i pomoc w zrozumieniu tematu kompilacji jądra za stroną: 

http://sokrates.mimuw.edu.pl/~sebek/linux-faq-old/faq-2.1-5.html