From: xf0r3m
- W uproszeczniu zamiana kodu źródÅowego na postaÄ wykonywalnÄ przez - komputer nosi nazwÄ kompilacji. Jednaj jak siÄ za + W uproszczniu zamiana kodu źródÅowego na postaÄ wykonywalnÄ przez + komputer nosi nazwÄ kompilacji. Jednak jak siÄ za chwilÄ okaże jest tylko poÅowa sukcesu (w wiÄkszoÅci przypadków). Obecnie w dystrybucjach Linuksa dostÄpne sÄ dwa kompilatory GNU C Compiler (gcc) oraz Clang/LLVM. W tym @@ -11353,7 +11353,7 @@ int main() { }
- Zapisany powyżej bardzo prosty program, zapisaÅem z w pliku + Zapisany powyżej bardzo prosty program, zapisaÅem w pliku hello.c. Pliki kodu źródÅowego jÄzyka C powinny mieÄ rozszerzenie .c. Chociaż wiemy, że w przypadku Uniksów nie to znaczenia, to dla utrzymania porzÄ dku w plikach, warto je pokrótce @@ -11373,7 +11373,7 @@ xf0r3m@vm-cac72df:~/C$ cc hello.c dziaÅania na standardowym wyjÅciu. Wynikiem jego pracy jest pojawienie siÄ tuż obok pliku a.out, który ma odpowiednii rodzaj uprawnieÅ, aby móc go odrazu uruchomiÄ - jest to plik - wykonywalny efekt - dziaÅania kompilatora na powierzonym mu kodzie. + wykonywalny, efekt dziaÅania kompilatora na powierzonym mu kodzie. PrzekonaÄ siÄ możemy o tym wydajÄ c poniższe polecenie:
@@ -11398,17 +11398,17 @@ Hello, World!
W przypadku pojednyczych programów takie dziaÅanie może wystarczyÄ,
jednak rzadko siÄ zdarza, aby programy byÅy pojedynczymi plikami
kodu źródÅowego, zazwyczaj zawierajÄ
go znacznie, znacznie wiÄcej.
- Sama praca z pojedyncz plikiem, może byÄ niepożÄ
dana przez
+ Sama praca z pojedynczym plikiem, może byÄ niepożÄ
dana przez
programistów jak i kompilatory mogÄ
mieÄ problem z ich
przetworzeniem.
GÅówne skÅadowe programów sÄ
najczÄÅciej grupowane a w pojedynczych
- plikach umieszcza siÄ ich poszczególne elementy. Kompilator również
+ plikach umieszcza siÄ ich poszczególne elementy. Kompilacja również
wyglÄ
da nieco inaczej. Wymagane jest użycie opcji -c w celu
utworzenia dla każdego ze skÅadowych
plików obiektowych - zawierajÄ
cych kod obiektowy,
- który finalnie przyjmie formÄ pliku wykonywalnego. ZaÅóżmy, że mam
+ który finalnie przyjmie formÄ pliku wykonywalnego. ZaÅóżmy, że mamy
tylko dwa pliki.
@@ -11483,7 +11483,8 @@ Hello, World!
zapomnimy wspomnieÄ o bibliotece konsolidatorowi to zostaniem nam
zwrócony bÅÄ
d. Chociaż bÅedy zwiÄ
zane z niewÅaÅciwym odwoÅaniem siÄ
do biblioteki, może nie wynikaÄ z naszych ustawieÅ konsolidatora.
- Może to również byÄ wynikiem braku zainstalownych w systemie.
+ Może to również byÄ wynikiem braku zainstalownych bibliotek w
+ systemie.
Do wskazania bibliotek sÅuży opcja -l kompilatora,
@@ -11492,7 +11493,7 @@ Hello, World!
dystrybucji jest to ten sam katalog - kiedy program typu init
to systemd), wystarczy podaÄ jej nazwÄ. W przeciwnym razie
musimy na poczÄ
tku wskazaÄ ÅcieżkÄ, na której można znaleÅºÄ tÄ
- bibliotekÄ - za pomocÄ
opcji -L a nastÄpnie podaÄ jej nazwÄ
+ bibliotekÄ - za pomocÄ
opcji -L, a nastÄpnie podaÄ jej nazwÄ
za pomocÄ
wspomanianej już wczeÅniej opcji -l.
@@ -11522,12 +11523,13 @@ $ cc -o badobject badobject.o -lcurses -L/usr/junk/lib -lcrud
Jak wiemy konsolidator zawsze dodaje do programów standardowÄ
bibliotekÄ jÄzyka C - libc.a. Ten plik jest
bibliotekÄ
statycznÄ
. Oznacza to, że konsolidator
- podczas tworzenia wÅaÅciwego pliku wykonywalne bÄdzie kopiowaÄ do
+ podczas tworzenia wÅaÅciwego pliku wykonywalnego bÄdzie kopiowaÄ do
naszego pliku fragmenty kodu maszynowego z biblioteki, wówczas plik
biblioteki nie bÄdzie nam potrzeby do uruchomienia.
- Tego typu ma dwie doÅÄ znaczÄ
ce wady. PierwszÄ
z nich sÄ
rozmiary
+ Tego typu rozwiÄ
zanie ma dwie doÅÄ znaczÄ
ce wady. PierwszÄ
z nich sÄ
+ rozmiary
bibliotek statycznych, a co za tym idzie rozmiary naszych programów
oraz zajÄtosÄ pamiÄci operacyjnej podczas ich pracy. DrugÄ
wadÄ
, ale
i nie kiedy zaletÄ
, jest fakt przechowywanie kopii kodu biblioteki
@@ -11544,8 +11546,8 @@ $ cc -o badobject badobject.o -lcurses -L/usr/junk/lib -lcrud
biblioteki wspóÅdzielone. Podczas konsolidacji z
wykorzystaniem bibliotek wspóÅdzielonych, nie sÄ
kopiowane caÅe
fragmenty kodu, a tylko odwoÅania do nazw w bibliotece. W tym
- przypadku biblioteka jest Åadowana do pamiÄci w momencie gdy sÄ
- potrzebne. DodatkowÄ
zaletÄ
tego rozwiÄ
zania jest fakt, że procesy
+ przypadku biblioteka jest Åadowana do pamiÄci w momencie gdy jest
+ potrzebna. DodatkowÄ
zaletÄ
tego rozwiÄ
zania jest fakt, że procesy
mogÄ
wspóÅdzieliÄ ze sobÄ
obszar pamiÄci, w którym znajdujÄ
siÄ
biblioteki, aby nie ÅadowaÄ ich za każdym razem, gdy uruchamiamy
jakiÅ program.
@@ -11577,7 +11579,7 @@ $ cc -o badobject badobject.o -lcurses -L/usr/junk/lib -lcrud
@@ -11683,9 +11685,9 @@ ldconfig: Åcieżka `/usr/lib' podana wiÄcej niż raz bardziej szczegóÅowych komunikatów.
- Program ld.so może wykorzystaÄ wykorzystaÄ jescze jedno + Program ld.so może wykorzystaÄ jeszcze jedno miejsce w celu znalezienia informacji na temat gdzie mogÄ znajdowaÄ - siÄ biblioteki - zmienne LD_LIBRARY_PATH. Nie + siÄ biblioteki - zmiennÄ LD_LIBRARY_PATH. Nie we wszystkich systemach jest ona zdefiniowana i może zostaÄ wykorzystana do wskazania niestandardowych bibliotek tuż przed uruchomieniem programu. @@ -11706,7 +11708,7 @@ ldconfig: Åcieżka `/usr/lib' podana wiÄcej niż raz wczeÅniej - w przypadku bibliotek statycznych). Tutaj niezbÄdne bÄdzie również wskazanie katalogu w celu dodania go do Åcieżki wyszukiwania bibliotek. W tego typu przypadkach nie należy posÅugiwaÄ - siÄ ustawieniemi konsolidatora dynamicznego. + siÄ ustawieniami konsolidatora dynamicznego.
Opcja, o której mowa to:-Wl,-rpath.
@@ -11734,7 +11736,7 @@ xf0r3m@laptop-5cfe659:~$ cc -o myprog myprog.o -Wl,rpath=/opt/pt/lib -L/opt/pt/l
LD_LIBRARY_PATH. ZawartoÅÄ tej
zmiennej jest odczytywana przez konsolidator, który nastÄpnie
przeszukuje podane Åcieżki pod kÄ
tem wystÄpowania bibliotek. Ta
- zmianna ma pierwszeÅstwo przez pozostaÅymi lokalizacjami, w których
+ zmiana ma pierwszeÅstwo przez pozostaÅymi lokalizacjami, w których
mogÄ
wystÄ
piÄ biblioteki w systemie. Dlatego też ustawienie jej
globalnie gdzieÅ w systemie (np. w plikach konfiguracyjnych powÅoki)
może spowodowaÄ znaczy spadek wydajnoÅci systemu. JeÅli już musimy
@@ -11859,11 +11861,11 @@ xf0r3m@laptop-5cfe659:~$ cc -c -I/opt/pt/include netstats.c
byÅa szybka i przyjmna. Jednak w 99% przypadków z jakim możemy
spotkaÄ siÄ raczej tak nie bÄdzie folder bÄdÄ
zawieraÄ podkatalogi
a w nich sterty plików rÄczna kompilacja, przy nie których
- mogÅa by zajÄ
Ä tygodnie jak nie lata. Dlatego też powstaÅo narzÄdze
+ mogÅa by zajÄ
Ä tygodnie jak nie lata. Dlatego też powstaÅo narzÄdzie
typu make. NarzÄdzie make ma za zadanie
zarzÄ
dzaÄ procesem kompilacji. Mimo, że jest to potÄżny program to
jest on doÅÄ prosty w dziaÅaniu. JeÅli gdzieÅ w paczkach z kodem
- znajdziemy plik makefile lub Makefile ozanacza to
+ znajdziemy plik makefile lub Makefile oznacza to
możemy użyÄ programu make do kompilacji projektu.
@@ -11875,7 +11877,7 @@ xf0r3m@laptop-5cfe659:~$ cc -c -I/opt/pt/include netstats.c zależnoÅciami.
- W czasie wykonywania celów, narzÄdziÄ postÄpuje zgodnie z
+ W czasie wykonywania celów, narzÄdzie postÄpuje zgodnie z
reguÅÄ
(ang. rule), która może np. okreÅlaÄ
sposób w jaki kod źródÅowy ma zostaÄ zmieniony na plik obiektowy.
Sam make posiada już zdefiniowane reguÅy, ale możemy je
@@ -11915,8 +11917,8 @@ myprog: $(OBJS)
myprog: widzimy już jakieŠkonkrety:
pierwszym jest odwoÅanie siÄ do makra, jest ono rozwiÄ
zywane do
nazw zapisanych na poczÄ
tku pliku Makefile, w pliku nie
- znajduje siÄ Å¼adne inne elementy systemu Make tak wiÄc
- ten cel jest o tych plików uzależniony. Warto dodaÄ, że
+ znajduje siÄ Å¼adne inne elementy systemu Make o tej nazwie
+ tak wiÄc ten cel jest od tych plików uzależniony. Warto dodaÄ, że
Make zakÅada, że plki źródÅowe znajdujÄ
siÄ w tym samym
katalogu co pliki Makefile. Uruchomienie polecenia
make w tym katalogu prezentuje siÄ nastÄpujÄ
co.
@@ -11948,7 +11950,7 @@ cc -o myprog aux.o main.o
Każde polecenie w pliku Makefile musi zostaÄ
wprowadzone w nowej linii i poprzedzone
znakiem tabulacji równym czterem znakom spacji.
- Makro $(CC) jest zmiennÄ
, która
+ Makro $(CC)
przechowywuje nazwÄ programu kompilatora C, w wiekszoÅci przypadku
jej wartoÅÄ bÄdzie ustawiona na cc.
- Natomiast jeÅli chociażby zmienimy datÄ, któregoÅ z plików kodu + Natomiast jeÅli chociażby zmienimy czas modyfikacji, któregoÅ z + plików kodu źródÅowego za pomocÄ prostego polecenia touch. Wówczas plik obiektowy bÄdzie starszy niż plik źródÅowy i Make dokona budowy naszego programu ponownie. @@ -12000,7 +12003,7 @@ cc -o myprog aux.o main.o
UzupeÅniajÄ c wywoÅanie programu make o różne opcje oraz argumenty możemy zmusiÄ go do wykonani kilku przydatnych czynnoÅci. - Najprostrzym przykÅadem może byÄ zmiana wartoÅci makra CC, + Najprostszym przykÅadem może byÄ zmiana wartoÅci makra CC, wskazujÄ c inny niż domyÅlny kompilator.
@@ -12021,7 +12024,7 @@ cc foo.o -o foo
Tego typu uruchmianie narzÄdzia make bedzie sprawdzaÄ siÄ
w przypadku programów zapisanych w jednym pliku lub programów, w
- których jezykiem nie jest C. Jest to drobre rozwiÄ
zanie gdy dopiero
+ których jezykiem nie jest C. Jest to dobre rozwiÄ
zanie gdy dopiero
rozpoczynamy pracÄ z danym jÄzykiem i nie wiem jeszcze jak dziaÅa
kompilator czy inne narzÄdzia z nim zwiÄ
zane. JeÅli nawet zbudowanie
celu siÄ niepowiedzie to i tak otrzymamy informacjÄ zwrotnÄ
co jest
@@ -12054,7 +12057,7 @@ cc foo.o -o foo
W pozostaÅej czÄsci plików wystÄpujÄ już cele, które skÅadajÄ gÅówne - pliki wykonywalne. JeÅli trzeb przygowaÄ reguÅÄ dla pliku obiektowego + pliki wykonywalne. JeÅli trzeba przygowaÄ reguÅÄ dla pliku obiektowego należy jÄ umieÅciÄ zaraz nad reguÅÄ programu pliku wykonywalnego. JeÅli z tego pliku obiektowego korzysta wiÄcej plików wykonywalnych niż ten jednen to trzeba je przenieÅÄ nad nie wszystkie. @@ -12184,7 +12188,7 @@ PROGS=boring trite programowania, zmieniÅo siÄ to wraz z rozpowszechnieniem siÄ takich jÄzyków jak Perl a w poźniejszych latach Python. Niektóre z narzÄdzi systemowych zostaÅy - przepisane z klasycznego C do np. Pytona - na przykÅad narzÄdziem + przepisane z klasycznego C do np. Pythona - na przykÅad narzÄdziem whois. JÄzyki skryptowe obecnie przechylajÄ szalÄ na swojÄ korzyÅÄ wzglÄdem jÄzyków kompilowanych, mimo to zalety takich jÄzyków jak C oraz wpisanie siÄ tego jÄzyka w rdzeÅ nauk komputerowych @@ -12237,7 +12241,7 @@ PROGS=boring trite Uniksowych. JÄzyk ten ma ogromne możliwoÅci porównywalne z Pythonem, jednak nie jest on taki prosty w użyciu. Jego gÅównym zadaniem jest obróbka tekstu. Obecnie wiele narzÄdzi wykorzystuje jego możliwoÅci - np. znany wszyskim system kontroli wersji - Git. + np. znany wszystkim system kontroli wersji - Git.
Innym wartym wspomnienia jÄzykiem jest m4 odpowiedzialny z przetwarzanie makr. DostÄpny jest on w systemie - GNU autotools. + GNU autotools. Bierze udziaÅ w automatycznym generowaniu + pliku Makefile (Wiecej w 15 rozdziale).