gcc, Linux

[ Pobierz całość w formacie PDF ]
MateriaĀy pomocnicze do przedmiotu UĄytkowanie Systemu Unix
Narz·dzia do programowania w j·zyku C
Cz·å I
OpracowaĀ: dr inĄ. Zbigniew Jaworski
1. Kompilator j·zyka C
J·zyk C jest j·zykiem oglnego stosowania. Jest on jednak åciåle zwizany z systemem
Unix, dlaÉpotrzeb ktrego zostaĀ opracowany. System operacyjny, kompilator C i niemal
wszystkie programy usĀugowe systemu Unix zostaĀy napisane w C (lub C++).
W starszych wersjach systemw (np. w systemie SunOS 4.x) kompilator j·zyka C byĀ
dostarczany przez producenta i standardowo nosiĀ nazw·
cc
. Powodem tego byĀa
konstrukcja systemu, ktra w przypadku zmiany konfiguracji jdra wymagaĀa jego
rekomplilacji. Obecnie wi·kszoå systemw nie wymaga takich operacji i kompilator C nie
jest elementem systemu.
Oprcz kompilatorw Ñwbudowanych do systemuÒ istniej rwnieĄ inne ich wersje,
zarwno komercyjne jak i dost·pne jako freeware (np.: kompilator
gcc
stworzony
iÉrozpowszechniany przez Free Software Foundation). W dalszej cz·åci tej instrukcji
zajmowa si· b·dziemy kompilatorem gcc.
1.1. Od tekstu rdĀowego programu do kodu wykonywalnego
Proces tworzenia binarnego kodu wykonywalnego, zwany zwyczajowo kompilacj,
skĀada si· zÉkilku odr·bnych etapw.ÉS to:
¤É
prekompilacja
(
ang. preprocessing
) - polega na stworzeniu ostatecznego tekstu
rdĀowego programu poprzez wĀczenie plikw wskazanych dyrektyw preprocesora
#include
, wykonanie podstawieà makrodefinicji
#define i
opcjonalne usuni·cie
komentarzy.
¤É
kompilacja do kodu asemblera
(
ang. compilation
) - polega na tym, Ąe kompilator
przegldajc kod rdĀowy programu otrzymany po etapie prekompilacji wyszukuje tokeny
(sĀowa kluczowe, operatory) i przeksztaĀca je na wewn·trzn reprezentacj·. Reprezentacja
wewn·trzna jest nast·pnie przeksztaĀcana na kod asemblera. Jeåli nie jest to moĄliwe to
kompilator sygnalizuje bĀ·dy.
¤É
optymalizacja kodu asemblera
(
ang. optymalization
) - polega na zmianie kodu
asemblera w celu zwi·kszenia jego efektywnoåci. Kod poddawany jest modyfikacjom takim
jak zmiana sposobu obliczania adresw wzgl·dnych, eliminacja nieuĄywanych fragmentw
kodu, optymalizacja przydziaĀu rejestrw oraz zmiana lokalnych odwoĀaà w taki sposb, by
uĄywany byĀ wskanik stosu. Ten etap kompilacji jest opcjonalny.
¤É
asemblacja
(
ang. assembly
) - polega na przetworzeniu kodu asemblera w relokowalny
kod w j·zyku maszynowym. Instrukcje w tym kodzie nie odnosz si· jeszcze do
konkretnych adresw w pami·ci. Kod umieszczany jest w pliku obiektowym (
ang. object
file
). Etap ten wykonywany jest przez program
as
(systemowy) lub
gas
(z pakietu GNU).
- 1 -
MateriaĀy pomocnicze do przedmiotu UĄytkowanie Systemu Unix
¤É
konsolidacja
(
ang. link editing
) - konsolidator, lub Ąargonowo linker (
ang. link editor
),
dokonuje szeregu operacji w celu stworzenia pliku binarnego z kodem wykonywalnym :
1)Éprzeszukanie standardowego zestaw bibliotek oraz bibliotek wskazanych w linii
wywoĀania w celu wĀczenia do programu kodu funkcji niezdefiniowanych w moduĀach
stworzonych przez uĄytkownika (np.: printf(), sin()). W przypadku braku kodu danej
funkcji we wszystkich przeszukanych bibliotekach konsolidator sygnalizuje bĀ·dy i koÃczy
prac·.
2)Éprzypisanie kodu maszynowego do ustalonych adresw, np. zmienne globalne otrzymuj
konkretne adresy tak, aby moĄna si· odwoĀywa do ich wartoåci.
3)Éutworzenie wykonywalnego pliku binarnego w formacie ELF (
ang. Executable and
Linking Format
)
Konsolidacja wykonywana jest przez program
ld
.
1.2. Parametry wywoĀania kompilatora
Polecenie wywoĀania kompilatora ma nast·pujc posta :
gccÉÉ[opcje]ÉÉplik
1
È plik
n
Zawartoå argumentu
plik
i
okreålana jest na podstawie dwuznakowego rozszerzenia
(koÃcwki nazwy), zgodnie z nast·pujc konwencj :
Rozszerzenie
Zawartoåě
PrzykĀad
.c
tekst rdĀowy w j·zyku C
main.c
.s
kod w j·zyku asemblera
main.s
.o
kod relokowalny (wynik asemblacji)
main.o
.a
biblioteka
libc.a
Do najcz·åciej uĄywanych opcji naleĄ:
-
o
É
nazwa
powoduje zmian· nazwy programu wynikowego na podan przez uĄytkownika;
np.:
gcc -o prog main.c
, powoduje nadanie nazwy
prog
zamiast
standardowej
a.out
,
-E
powoduje zatrzymanie po etapie prekompilacji, wyniki s wypisywane na
ekran,
-S
powoduje zatrzymanie po etapie generowania kodu asemblera, wyniki s
umieszczane w pliku z rozszerzeniem
.s
,
-c
powoduje zatrzymanie po etapie asemblacji, wyniki s umieszczane w pliku
zÉrozszerzeniem
.o
,
-D
makro
uĄycie opcji jest rwnoznaczne z umieszczeniem liniiÉ
#define makro
naÉpocztku pliku zawierajcego tekst rdĀowy,
-
U
makro
uĄycie opcji jest rwnoznaczne z umieszczeniem liniiÉ
#undefÉmakro
naÉpocztku pliku zawierajcego tekst rdĀowy,
-O
powoduje wykonanie optymalizacji,
- 2 -
MateriaĀy pomocnicze do przedmiotu UĄytkowanie Systemu Unix
-O
poziom
powoduje wykonanie bardziej zĀoĄonej optymalizacji. Parametr
poziom
moĄe
przyjmowa wartoåci 1, 2 i 3. UĄycie tej opcji powoduje wzrost czasu
kompilacji i zapotrzebowania na pami· w porwnaniu do opcji -O.
-g
powoduje wĀczanie do pliku wynikowego informacji (numery linii, typ i
rozmiar identyfikatorw, tablica symboli) umoĄliwiajcych åledzenie
wykonywania programu wynikowego (
ang. debugging
);
UWAGA! Opcje -O i -g zwykle nie mog byě stosowane jednoczeånie.
Jednak kompilator gcc dopuszcza tak moČliwoåě pozwalajc na
ograniczone åledzenie zoptymalizowanego kodu programu.
-I
dir
powoduje wĀczenie katalogu
dir
do zestawu katalogw, w ktrych naleĄy
poszukiwa plikw nagĀwkowych,
-L
dir
powoduje wĀczenie katalogu
dir
do åcieĄki poszukiwaà bibliotek; w linii
wywoĀania opcja ta musi poprzedza opcj·
-
l
(wyjaånienie poniĄej),
-l
ident
polecenie dla konsolidatora (programu
ld
), ktre powoduje, Ąe
bibliotekaÉ
lib
ident
.a
Éjest przeszukiwana w celu znalezienia kodu funkcji
zewn·trznych.
-pipe
powoduje, Ąe kompilator
gcc
zamiast tworzy pliki poårednie do komunikacji
pomi·dzy programami wykonujcymi kolejne etapy kompilacji wykorzystuje
do tego celu Ācza (
ang. pipe
). Opcja nie dziaĀa na systemach gdzie asembler
nie moĄe czyta danych ze strumienia wejåciowego. DziaĀa prawidĀowo przy
korzystaniu z asemblera
gas
.
-ansi
tekst rdĀowy musi by w 100% by zgodny z norm ANSI j·zyka C.
-
traditional
toleruje starsze konstrukcje j·zyka C, z tzw. wersji j·zyka K&R opisan w
ksiĄce autorw j·zyka B.W.Kernighan i D.M.Ritchie
Najprostszym sposobem uĄycia kompilatora jest wydanie polecenia :
gcc main.c
Kompilator potraktuje wtedy zawartoå pliku
main.c
jako tekst rdĀowy w C (zgodnie z
obowizujc konwencj) i wykona wszystkie etapy kompilacji, aĄ do uzyskania kodu
wykonywalnego, ktry zostanie umieszczony w pliku o standardowej nazwie
a.out
. Na
etapie konsolidacji pod uwag· b·dzie wzi·ta tylko biblioteka
libc.a
, zawierajca kod
standardowych funkcji j·zyka C takich jak
printf()
,
fopen()
, i.t.d. Wszystkie pliki
poårednie zostan usuni·te.
W bardziej skomplikowanym przypadku, gdy tekst rdĀowy znajduje si· nie w jednym
lecz w kilku plikach, np.:
main.c
,
data.c
,
input.c
i
output.c
i dodatkowo
programista uĄyĀ funkcji matematycznych, polecenie kompilacji powinno wyglda
nast·pujco :
gcc input.c output.c data.c main.c -lm
Kompilator dla kaĄdego z plikw wykona wszystkie etapy kompilacji, aĄ do uzyskania
plikw obiektowych
main.o
,
data.o
,
input.o
i
output.o
, a nast·pnie dokona ich
konsolidacji biorc tym razem pod uwag· oprcz biblioteki
libc.a
takĄe bibliotek·
libm.a
zawierajc kod funkcji takich jak
sin()
,
cos()
, i.t.d. Program wykonywalny
znajdzie si· w pliku
a.out
. Podobnie jak wÉpoprzednim przykĀadzie wszystkie pliki
poårednie oprcz plikw obiektowych zostan usuni·te.
- 3 -
MateriaĀy pomocnicze do przedmiotu UĄytkowanie Systemu Unix
Argumentami wywoĀania kompilatora
gcc
mog by rĄne typy plikw i moĄliwa jest
sytuacja, wÉktrej kaĄdy z argumentw jest innego typu (uzyskany zostaĀ przez zatrzymanie
kompilacji po innym etapie), np.:
gcc main.o data.s input.i output.c -lm
Pliki, ktre w czasie prekompilacji maj by wĀczone do tekstu programu (przy
pomocy dyrektywy
#include
) musz znajdowa si· w bieĄcym katalogu (dotyczy to
plikw nagĀwkowych stworzonych przez uĄytkownika) lub w standardowym katalogu
instalacyjnym kompilatora (standardowe pliki nagĀwkowe kompilatora. np. stdio.h). Jeåli
programista chce umieåci wĀasne pliki nagĀwkowe w innym katalogu niĄ pliki z tekstem
rdĀowym, to by uczyni je dost·pnymi dla kompilatora, musi w linii wywoĀania uĄy opcji
-I
dir
, gdzie
dir
jest nazw tego katalogu (wzgl·dn lub bezwgl·dn). PrzykĀadowo, jeåli
pliki nagĀwkowe zostaĀy umieszczone w katalogu
../headers
to wywoĀanie kompilatora
ma posta:
gcc -I../headers input.c output.c data.c main.c
Podobnie jest w przypadku bibliotek. Konsolidator oczekuje, Ąe biblioteki znajduj si·
w standardowym katalogu instalacyjnym. Jeåli uĄytkownik korzysta z innych bibliotek
(np.Éstworzonych samodzielnie) to musi poinformowa konsolidator przy pomocy opcji
-L
dir
, gdzie one si· znajduj. Informacja ta musi poprzedzi opcj·
-l
. PrzykĀadowo, jeåli
dodatkowa biblioteka nosi nazw·
libusux.a
i znajduje si· w katalogu
../libs
, to
wywoĀanie kompilatora powinno mie posta:
gcc main.c data.c input.c output.c -L../lib -lusux
NaleĄy zwrci uwag· na reguĀ· nadawania bibliotekom nazw. Nakazuje ona, by nazwa
bibioteki miaĀa posta
lib
ident
.a
, gdzie pole
ident
moĄe mie dĀugoå od 1 do 7
znakw. W linii wywoĀania kompilatora, po opcji
-l
, podawana jest tylko cz·å
ident
zamiast caĀej nazwy biblioteki, np.:
-l
m
dla biblioteki
libm.a
.
2. Biblioteki
Bibliotek (
ang. library archive
) jest archiwum plikw obiektowych zawierajce
nagĀwek, w ktrym znajduj si· informacje m.in. o nazwach i poĀoĄeniu wewntrz
archiwum poszczeglnych obiektw oraz tablic· symboli bibliteki. Taka organizacja
biblioteki zwi·ksza efektywnoå jej przeszukiwania podczas konsolidacji.
Wraz z systemem dostarczane s jego standardowe biblioteki takie jak
libc.a
czy
libm.a
. Oprcz nich istniej biblioteki zawierajce zestaw funkcji przeznaczonych do
specjalnych zastosowaà jak np.
libcurses.a
umoĄliwiajca programiåcie programow
obsĀug· terminali. NiezaleĄnie od bibliotek dost·pnych w danym systemie kaĄdy
uĄytkownik moĄe tworzy wĀasne biblioteki, ktre mog by nast·pnie uĄywane w taki sam
sposb jak systemowe. Do tego celu uĄywany jest program
ar
. Zasady posĀugiwania si·
tym programem s bardzo podobne do sposobu korzystania z programu
tar
.
WywoĀanie
ar
ma nast·pujc skĀadni· :
ar [opcje] archiwum plik
1
... plik
n
Argument
archiwum
jest nazw biblioteki, a
plik
1
È plik
n
s plikami obiektowymi,
zÉktrych naleĄy stworzy bibliotek·, lub ktre naleĄy wyekstrahowa lub usun z
biblioteki. Najcz·åciej uĄywane opcje to:
- 4 -
MateriaĀy pomocnicze do przedmiotu UĄytkowanie Systemu Unix
-
d
usuwanie z archiwum wskazanego pliku,
-q
dodaje plik na koniec archiwum (UWAGA! nie sprawdza czy dany plik jest juĄ w
archiwum),
-r
zamiana (lub dodanie) wskazanego pliku w archiwum; jeåli pliku nie ma w archiwum
to nast·puje jego dodanie, a w przypadku gdy nie istnieje archiwum - jego utworzenie,
-u
uĄywana razem z
-r
powoduje, Ąe zamiana nast·puje tylko wtedy, gdy data
modyfikacji pliku w archiwum jest wczeåniejsza niĄ data modyfikacji pliku podanego
jako argumentu,
-s
ponowne utworzenie tablicy symboli biblioteki; umoĄliwia odtworzenie tablicy
symboli po jej usuni·ciu programem
strip
,
-t
wypisanie zawartoåci archiwum; zwykle uĄywana razem z opcj
-v
,
-x
ekstrakcja wskazanego lub wszystkich plikw z archiwum (nie niszczy archiwum),
-v
wyåwietlanie bardziej szczegĀowych informacji podczas dziaĀania.
PrzykĀadowo, jeåli programista chce utworzy bibliotek·
libusux.a
z nast·pujcych plikw:
funkcja1.o

funkcja2.o
ÉiÉ
funkcja3.o
,Éto polecenie moĄe mie posta:
ar -rv libusux.a funkcja1.o funkcja1.o funkcja1.o
lub
ar -ruv libusux.a funkcja1.o funkcja1.o funkcja1.o
Jeåli biblioteka
libusux.a
nie istniaĀa wczeåniej, to w obu przypadkach zostanie utworzona.
Opcja
Ïr
stanowi zabezpieczenie przed sytuacj, w ktrej do istniejcej juĄ biblioteki
dopisywane byĀy by za kaĄdym razem nowe wersje plikw
funkcja1.o
,
funkcja2.o
i
funkcja3.o
.
Sprawdzenie zawartoåci biblioteki moĄliwe poprzez wydanie nast·pujce polenia:
ar -tv libusux.a
3. Pomocnicze programy narz·dziowe
W procesie tworzenia programu uĄytkownik moĄe wykorzystywa nast·pujce programy
pomocnicze, dost·pne standardowo w systemie Unix:
gdb
program uruchomieniowy (ang. debugger)
nm
wypisuje informacje zawarte w tablicy symboli pliku wykonywalnego, pliku
obiektowego lub biblioteki,
strip
usuwa z pliku wykonywalnego, pliku obiektowego lub biblioteki tablic· symboli
oraz dodatkowe informacje doĀczone do pliku w wyniki kompilacji z uĄyciem
opcji -g,
- 5 -
[ Pobierz całość w formacie PDF ]

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • radiodx.htw.pl
  •