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ść:
1
#include<stdio.h>
2
double kwadrat(double x)
3
{
4
return (x)*(x);
5
}
6
int main(int argc, char* argv[])
7
{
8
double liczba, kw_liczby;
9
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:
1
#include<stdio.h>
2
double kwadrat(double x);
3
double szescian(double x);
4
int dodaj(int a, int b);
5
void powitaj(char* dopisek);
6
int main(int argc, char* argv[])
7
{
8
double liczba, kw_liczby;
9
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:
1
double kwadrat(double x)
2
{
3
return (x)*(x);
4
}
5
powitanie.c:
6
#include<stdio.h>
7
void powitaj(char* dopisek)
8
{
9
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:
1
CC = gcc
2
CFLAGS = -O1
3
Licz1.exe : licz1.o funkcje.o powitanie.o
4
$(CC) $(CFLAGS) -o $@ $?
5
liczh.o : licz1.c
6
$(CC) $(CFLAGS) -c $?
7
funkcje.o : funkcje.c
8
$(CC) $(CFLAGS) -c $?
9
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)
-
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
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