From: xf0r3m
+ Dystrybucje Linuksa, nie wymagajÄ do podstawowej obsÅugi posiadania + jakich kolwiek umiejÄtnoÅci programistycznych. Nie mniej jednak + ten rodzaj systemów operacyjnych jest niezwykle czÄsto wybierany + przez programistów, ze wzglÄdu na swojÄ przejrzystoÅÄ oraz obszerne + udokumnetowanie. +
++ OdwiedzajÄ c tÄ stronÄ czy też czytajÄ c ten materiaÅ, za pewne + oczekujemy od naszych komputerów czegoÅ wiÄcej niż wyÅwietlenie + Å¼Ä danej strony internetowej czy odtworzenie wybranego pliku wideo. + Może nadejÅÄ taka sytuacja, w której bÄdziemy mieli stycznoÅÄ z kodem + źródÅowym i to nie tylko jÄzyków interpretowanych (zostanÄ one + omówione również) ale także jÄzyków takich jak C, C++ czy Java. + Warto zapoznaÄ siÄ z narzÄdziami programistycznymi dostÄpnymi w + dystrybucjach, aby czytajÄ c pliki README dostarczone do paczek z + kodem czy innej jego dokumentacji wiedzieÄ co siÄ robi i byÄ może + dostosowaÄ proces tworzenia plików wykonywalnych do wÅasnych wymagaÅ. +
++ Za pomocÄ jÄzyka C, stworzono caÅy ten tematyczny obszar wokóÅ, + które oscyluje ten materiaÅ. Wszystkie obecnie wykorzystywane Uniksy + korzystajÄ z jÄzyka C. Dlatego też warto wiedzieÄ na tym etapie, w + jaki sposób możemy uruchomiÄ program, który dostaniem w postaci + zrozumiaÅej dla czÅowieka - w postaci kodu źródÅowego (zwykÅego + tekstu). +
++ W uproszeczniu zamiana kodu źródÅowego na postaÄ wykonywalnÄ przez + komputer nosi nazwÄ kompilacji. Jednaj 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 + materiale skupimy siÄ na klasycznym kompilatorze gcc. +
++ Kompilator oraz inne narzÄdzia programistyczne mogÄ domyÅlnie nie + wystÄpowaÄ w dystrybucjach. W przypadku Debiana czy Ubuntu wystarczy + zainstalowaÄ za pomocÄ domyÅlnego menedżera pakietów pakiet + build-essential, w przypadku rodziny dystrybucji opartych + o Red Hat należy użyÄ grupy instalacyjnej Development Tools. +
++ W celu zobrazowania bÄdÄ umieszczaÄ w przykÅadach bardzo proste + proste programy zapisane w jÄzyku C. Tak jak wspominaÅem, nie jest + wymagana umiejÄtnoÅÄ programowania w żadnym z jÄzyków. +
+
+#include <stdio.h>
+
+int main() {
+ printf("Hello, World!\n");
+}
+
+ + Zapisany powyżej bardzo prosty program, zapisaÅem z 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 + opisaÄ za pomocÄ zwykÅego rozszerzenia plików. +
++ Aby zamieniÄ kod źródÅowy na postaÄ niskopoziomowÄ wykonywalnÄ przez + nasz komputer musimy skompilowaÄ kod przy użyciu kompilatora. + Program ten może byÄ dostÄpny za pomocÄ poleceÅ cc lub + gcc +
++xf0r3m@vm-cac72df:~/C$ cc hello.c ++
+ Polecenie to powinno zakoÅczyÄ siÄ, bez oznajmiania jakiego kolwiek + 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. + PrzekonaÄ siÄ możemy o tym wydajÄ c poniższe polecenie: +
++xf0r3m@vm-cac72df:~/C$ ./a.out +Hello, World! ++
+ WczeÅnie uruchamiajÄ c kompilator nie podaliÅmy mu poza kodem żadnych + innych informacji. JeÅli chcemy, aby nasz plik wykonywalny miaÅ + bardziej odpowieniÄ nazwÄ możemy jÄ podaÄ jako wartoÅÄ opcji + -o. +
++xf0r3m@vm-cac72df:~/C$ cc -o hello hello.c +xf0r3m@vm-cac72df:~/C$ ls +a.out hello hello.c +xf0r3m@vm-cac72df:~/C$ ./hello +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 + 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ż + 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 + tylko dwa pliki. +
++ main.c: +
+
+void hello_call();
+int main() {
+ hello_call();
+}
+
+ + aux.c: +
+
+#include <stdio.h>
+
+void hello_call() {
+ printf("Hello, World!\n");
+}
+
+ + Teraz dla każdego z plików źródÅowych, musimy wygenerowaÄ pliki + obiektowe. Pliki obiektowe sÄ teoretycznie plikami wykonywalnymi + ale brakuje w nich informacji pozwalajÄ cych na dokoÅczenie + kompilacji. Sam system nie wie jak ma uruchomiÄ pliki obiektowe, + zazwyczaj na jeden program skÅada siÄ wiele plików obiektowych. +
++xf0r3m@vm-cac72df:~/C$ cc -c main.c +xf0r3m@vm-cac72df:~/C$ cc -c aux.c +xf0r3m@vm-cac72df:~/C$ ls +aux.c aux.o main.c main.o ++
+ W celu poÅaczenia plików obiektowych w plik wykonywalny użyjemy + innego narzÄdzia, jakim jest konsolidator. Na + systemach uniksowych nosi on nazwÄ ld i rzadko jest + uruchamiany przez programistów samodzielnie. Kompilator wie w jaki + sposób należy go uruchomiÄ, dlatego też skorzystamy z jego pomocy. + Mimo tego, że bÄdziemy używaÄ innego narzÄdzia to polecenie + pozostaje to samo. Konsolidator może również wystÄpowaÄ pod nazwÄ + linker. +
++xf0r3m@vm-cac72df:~/C$ cc -o myprog main.o aux.o +xf0r3m@vm-cac72df:~/C$ ls +aux.c aux.o main.c main.o myprog +xf0r3m@vm-cac72df:~/C$ ./myprog +Hello, World! ++
+ Dla celów dydaktycznych stworzyliÅmy program skÅadajÄ cy z dwóch + plików kodu źródÅowego, zwykle jednak jest tego o wiele wiele wiÄcej. + Tutaj poszczególne czynnoÅci wykonaliÅmy rÄcznie. JeÅli w przypadku + normalnego programu mielibyÅ to robiÄ w ten sposób, zajÄÅo by to + masÄ czasu. Na szczÄÅcie nie trzeba robiÄ tego rÄcznie. Wykorzystamy + do tego narzÄdzie GNU make, które omówimy sobie + za chwilÄ. +
++ Obecne systemy do utworzenia peÅnoprawnego programu z plików + obiektowych wymagajÄ zbiorów wczeÅniej skompilowanych komponentów. + Pliki obiektowe zawierajÄ ce te zestawy nie sÄ niczym innym jak + bibliotekami, a w ich skÅad poza wspomnianymi już + plikami wchodzÄ również pliki nagÅówkowego, których używaliÅmy już + w kodzie programów przy użyciu dyrektywy include. + Biblioteki dodawane sÄ na etapie konsolidacji, ich użycie w trakcie + tej czynnoÅci nazywane jest konsolidacjÄ na bazie + biblioteki. W przypadku kiedy podczas konsolidacji + 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. +
++ Do wskazania bibliotek sÅuży opcja -l kompilatora, + oczywiÅcie jeÅli znajdujÄ siÄ one w domyÅlnej lokalizacji tj. + /lib lub /usr/lib (chociaż w przypadku wiÄkszoÅci + 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Ä + za pomocÄ wspomanianej już wczeÅniej opcji -l. +
++ PrzekazujÄ c do konsolidatora (kompilatora) informacje o bibliotekach + wartoÅci opcji wraz z opcjami piszemy ÅÄ cznie. +
++$ cc -o badobject badobject.o -lcurses -L/usr/junk/lib -lcrud ++
+ Podczas wyszukiwania bibliotek, przydatne może okazaÄ siÄ polecenie + locate, niestety może nie byÄ domyÅlne zainstalowane w + systemie. Dodatkowo wywmaga ono aktualizacji bazy przy użyciu + polecenia updatedb. +
++ Nasze proste programiki z przykÅadów, nie sÄ pozbawione bibliotek. + Tak jak już wczeÅnie wspominaÅem kompilator nie jest wstanie utworzyÄ + peÅnoprawnego pliku wykonywalnego. Konsolidator zawsze doÅÄ cza do + utworzonego pliku obiektowego standardowÄ bibliotekÄ jÄzyka + C - libc.a - zawiera ona podstawowe komponenty + jÄzyka C, jest ona zawsze doÅÄ czana chyba, że Åwiadomie jÄ + wykluczymy. +
+2024; COPYLEFT; ALL RIGHTS REVERSED;