Mikroraunarski sistemi za rad u realnom vremenu GCC

  • Slides: 37
Download presentation
Mikroračunarski sistemi za rad u realnom vremenu „GCC i make“

Mikroračunarski sistemi za rad u realnom vremenu „GCC i make“

GCC Originalni GNU C Compiler (GCC) je razvijen od strane Ričarda Stolmana (Richard Stallman),

GCC Originalni GNU C Compiler (GCC) je razvijen od strane Ričarda Stolmana (Richard Stallman), osnivača GNU projekta i pored Linusa Torvaldsa, začetnikom Linux operativnog sistema 1984 godine GNU projekat je kreiran kako bi omogućio Unix-like operativni sistem kao free software, u cilju promovisanja slobode programiranja Vremenom je GCC obuhvatio podršku za druge programske jezike (C++, Objective-C, Java, Fortrana, Ada) tako da GCC danas znači GNU Compiler Collection

GNU Toolchain sadrži: GCC kompajler (osnovna komponenta) GNU Make (automatizovan alat za kompajliranje i

GNU Toolchain sadrži: GCC kompajler (osnovna komponenta) GNU Make (automatizovan alat za kompajliranje i build -ovanje aplikacija GNU Binutils (binarni alati uključujući linker i asembler) GNU Debugger (GDB) GNU Autotools GNU Bison

GCC je portabilan i može se izvršavati na mnogim operativnim sistemima Predstavlja prirodno okruženje

GCC je portabilan i može se izvršavati na mnogim operativnim sistemima Predstavlja prirodno okruženje za Linux i Unix-like OS Na Windows operativnim sistemima Min. GW i Cygwin Takođe, postoji i cross-kompajler koji omogućava pravljenje izvršnih fajlova za različite platforme (između ostalog ARM)

GCC i G++ GCC je kompajler za C, dok se kompajler za C++ naziva

GCC i G++ GCC je kompajler za C, dok se kompajler za C++ naziva G++ Primer: //hello. c #include <stdio. h> int main() { printf("Hello, world!n"); return 0; } > gcc hello. c >. /a. out

GCC Ukoliko želimo da menjamo ime izlaznog fajla: > gcc -o hello. c >.

GCC Ukoliko želimo da menjamo ime izlaznog fajla: > gcc -o hello. c >. /hello > Hello, World! U Linux-u se izvršni fajl uvek pokreće sa. /ime_binarnog_fajla Ovo praktično znači: pozovi fajl sa nazivom ime_binarnog_fajla iz trenutnog direktorijuma Moguće je pokrenuti program samo sam ime_binarnog_fajla samo ukoliko se putanja fajla nalazi u PATH environment varijabli

G++ Primer: //hello. cpp #include <iostream> using namespace std ; int main(){ cout <<

G++ Primer: //hello. cpp #include <iostream> using namespace std ; int main(){ cout << "Hello, world!” << endl ; return 0; } > g++ -o hellocpp hello. cpp >. /hellocpp

GCC kompajler opcije: gcc -Wall -g -o hello. c -Wall prikazuje SVE warning poruke

GCC kompajler opcije: gcc -Wall -g -o hello. c -Wall prikazuje SVE warning poruke -g generiše simbole potrebne za debagovanje korišćenjem gdb debagera Moguće je posebno kompajlirati i povezivati izvršni fajl: gcc -c -Wall -g hello. c //kao rezultat se dobija hello. o gcc -g -o hello. o //kao rezultat se dobija hello

GCC Moguće je istovremeno kompajlirati i povezivati više objektnih fajlova: gcc -o myprog file

GCC Moguće je istovremeno kompajlirati i povezivati više objektnih fajlova: gcc -o myprog file 1. c file 2. c Ili, moguće je i odvojeno najpre kompajlirati izvorne pa tek onda povezivati objektne fajlove gcc -c file 1. c gcc -c file 2. c gcc -o myprog file 1. o file 2. o

GCC proces kompajliranja

GCC proces kompajliranja

GCC proces kompajliranja Pozivanje predprocesora koji dodaje. h fajlove u. c cpp hello. c

GCC proces kompajliranja Pozivanje predprocesora koji dodaje. h fajlove u. c cpp hello. c > hello. i Kompajliranje, rezultat je asembler kod za dati procesor gcc -S hello. i Asembliranje, tj. Konvertovanje asemblerskog koda u mašinski kod u formi objektnog fajla as -o hello. s Povezivanje sa bibliotekama ld -o hello. o . . . libraries. . .

Header fajlovi i biblioteke Biblioteka je kolekcija pred-kompajliranih objektnih fajlova koji mogu da se

Header fajlovi i biblioteke Biblioteka je kolekcija pred-kompajliranih objektnih fajlova koji mogu da se povezuju sa izvršnim fajlom pomoću linker-a (npr printf(), sqrt()) Postoje dva tipa biblioteka: statičke i deljene Statička biblioteka ima ekstenziju. a (Linux) odnosno. lib (Windows) i prilikom povezivanja sa objektnim fajlom kod iz biblioteke se kopira u izvršni fajl. Ovakav tip biblioteke se može kreirati korišćenjem programa ar. Deljene biblioteke imaju ekstenziju. so (Linux) odnosno. dll (Windows). Kada se program povezuje sa ovakvom bibliotekom, samo mala tebela se kreira u izvršnom fajlu. Pre nego što se krene sa izvršavanjem, operativni sistem učitava mašinski kod zahtevan za eksterne funkcije i ovaj proces je poznat kao dinamičko povezivanje (dynamic linking). Na ovaj način se dobijaju manji izvršni fajlovi i čuva se prostor na disku jer se deljene biblioteke dele između više izvornih fajlova. Osim toga, nadogradnja sistema je moguća bez ponovnog rekompajliranja izvornog koda (samo je potrebno zameniti deljenu biblioteku)

Header fajlovi i biblioteke Prilikom kompajliranja, kompajleru su neophodni header fajlovi Linker-u su potrebne

Header fajlovi i biblioteke Prilikom kompajliranja, kompajleru su neophodni header fajlovi Linker-u su potrebne biblioteke da bi razrešio eksterne reference na druge objektne fajlove ili biblioteke Za svaki. h fajl korišćen od strane. c fajlova (korišćenjem #include direktive) kompajler traži include putanju. Ove putanje se specificiraju korišćenjem –Idir opcije ili environment varijable CPATH. Pošto su imena. h fajlova poznata, putanja je dovoljna

Header fajlovi i biblioteke Linker traži tzv. putanju biblioteke za sve biblioteke koje su

Header fajlovi i biblioteke Linker traži tzv. putanju biblioteke za sve biblioteke koje su potrebne kako bi se kreirao izvršni fajl Ova putanja se specificira sa –Ldir opcijom ili environment varijablom LIBRARY_PATH Dodatno, potrebno je tačno navesi i ime biblioteke: Na Unix –like i Linux operativnim sistemima za biblioteku libxxx. a potrebno je navesti –lxxx opciju U Windows operativnom sistemu, navodi se celo ime kao lxxx. lib

GCC environment varijable PATH: u njoj se traže izvršni fajlovi kao i deljene biblioteke

GCC environment varijable PATH: u njoj se traže izvršni fajlovi kao i deljene biblioteke (. dll, . so) CPATH: služi za pretraživanje include putanja za header fajlove. Ovaj direktorijum se pretražuje nakon direktorijuma specificiranog sa –Idir opcijom. Dodatno, C_INCLUDE_PATH i CPLUS_INCLUDE_PATH se mogu koristiti da se specificiraju C/C++ header fajlovi ukoliko je programski jezik naznačen tokom predprocesiranja LIBRARY_PATH: U njemu se traže biblioteke, nakon što se pretraže putanje specificirane sa –Ldir opcijom

Dodatni GCC alati “file“ služi za prikaz tipa objektnog ili izvršnog fajla > file

Dodatni GCC alati “file“ služi za prikaz tipa objektnog ili izvršnog fajla > file hello. o > hello. o: ELF 64 -bit LSB executable, x 86 -64, version 1 (SYSV), dynamically linked (using shared libs), for GNU/Linux 2. 6. 32 “nm” služi za izlistavanje tabele simbola u okviru objektnih fajlova. Obično se koristi da bi se utvrdilo da li je neka funkcija definisana u objektnom fajlu. Slovo T u drugoj koloni označava da je funkcija definisana, dok U označava da nije i da mora biti razrešena od strane linkera: > nm hello. o > 00000000 T main

Dodatni GCC alati “ldd“ proverava izvršni fajl i prilazuje sve deljene biblioteke koje su

Dodatni GCC alati “ldd“ proverava izvršni fajl i prilazuje sve deljene biblioteke koje su neophodne > ldd hello > linux-vdso. 1 => (0 x 00007 ffdcad 43000) libc. so. 6=>/lib/x 86_64 -linux-gnu/libc. so. 6 (0 x 00007 fddb 6 b 1 a 000) /lib 64/ld-linux-x 86 -64. so. 2 (0 x 00007 fddb 6 ee 4000)

GNU Make “make” automatizuje složene aspekte kreiranja izvršnog fajla iz izvornog koda Koristi makefile

GNU Make “make” automatizuje složene aspekte kreiranja izvršnog fajla iz izvornog koda Koristi makefile koji sadrži pravila kako se kreiraju izvršni fajlovi – sva pravila samo treba poslagati u makefile, nazvati ga makefile, Makefile ili GNUMakefile i pokrenuti komandu make Postoje knjige napisane o “make”-u, a ovde ćemo samo pomenuti osnovna pravila i elementarno korišćenje Dokumentaciju o “make”-u je moguće dobiti pomoću “make –help” ili pomoću “man make” koji izlistava tzv man pages

Primer Makefile-a all: hello: hello. o gcc -o hello. o: hello. c gcc -c

Primer Makefile-a all: hello: hello. o gcc -o hello. o: hello. c gcc -c hello. c clean: rm hello. o hello

Primer Makefile-a > make gcc -c hello. c gcc -o hello. o Pokretanje make

Primer Makefile-a > make gcc -c hello. c gcc -o hello. o Pokretanje make bez argumenata pokreće prvo pravilo na koje se naiđe, u ovom slučaju all Pravilo se sastoji od tri dela: 1. Odredište (target) 2. Lista preduslova (pre-requisites list) 3. Komande (commands)

Struktura makefile pravila target: pre-req 1 pre-req 2. . . command. . Odredište i

Struktura makefile pravila target: pre-req 1 pre-req 2. . . command. . Odredište i preduslovi su odvojeni sa : Komanda mora da počne sa TAB (ne space-ovi) Kada make evaluira pravilo, kreće se sa traženjem fajlova koji se nalaze u preduslovima. Ako ijedan od preduslova ima asocirano novo pravilo, to pravilo će biti prvo ažurirano

Struktura makefile pravila U primeru navedenom ranije, prvo pravilo na koje se naiđe je

Struktura makefile pravila U primeru navedenom ranije, prvo pravilo na koje se naiđe je “all” koje kao preduslov ima hello. Make ne može da pronađe fajl hello (barem u prvom pozivu), tako da traži odgovarajuće pravilo kako bi kreirao njega Pravilo hello ima preduslov “hello. o” i pošto ni taj fajl ne postoji, na sličan način se traži pravilo za njega Pravilo za “hello. o” ima preduslov “hello. c”, koji postoji u direktorijumu. Make tada proverava da li je hello. c ažuriran nakon poslednjeg pokretanja “make” komande. Ukoliko jeste, pokreće se komanda “gcc –c hello. c”. Rekurzivno unazad, pravilo “hello” će dalje da pokrene komandu “gcc –o hello. o”, dok pravilo “all” ne radi zapravo ništa

Struktura makefile pravila Ukoliko preduslov nije noviji od odredišta, komanda se neće pokrenuti Drugim

Struktura makefile pravila Ukoliko preduslov nije noviji od odredišta, komanda se neće pokrenuti Drugim rečima, komanda će se pokrenuti samo ako je odredište zastarelo u poređenju sa preduslovom (obratite pažnju da su i jedan i drugi zapravo fajlovi) Kao povrda toga, ako ponovo pokrenemo “make” komandu dobijamo sledeći ispis: make: Nothing to be done for “all”

Make poziv Prilikom pozivanja make komande, moguće je specificirati odredište, npr “make clean” uklanja

Make poziv Prilikom pozivanja make komande, moguće je specificirati odredište, npr “make clean” uklanja fajlove hello. o i hello. Ukoliko se pokrene “make” bez odredišta pozvaće se prvo odredište na koje se naiđe: “make all” je isto kao i “make” u primeru od gore Ukoliko komanda ne počinje za karakterom TAB, dobija se komanda “makefile: 4: *** missing separator. Stop. ” Ukoliko ne postoji makefile u trenutnom direktorijum dobija se greska “make: *** No targets specified and no makefile found. Stop. ”

Make -- napredno Makefile može da sadrži komentare koji počinju sa # i važe

Make -- napredno Makefile može da sadrži komentare koji počinju sa # i važe do kraja reda u kome su napisani Dugačke linije mogu biti “prelomljene” korišćenjem Pravila su obično organizovana tako da generalnija pravila idu prva: npr. Prvo pravilo u primeru od malopre je pravilo “all” koje rekurzivno poziva sva ostala pravila Tzv Lažna odredišta (phony targets) su odredišta koja ne predstavljaju fajlove. Na primeru od malopre “clean” bi bio jedan primer takvog lažnog odredišta. Ukoliko je odredište fajl, biće proverena zastarelost njegovih preduslova, dok se lažna pravila uvek izvršavaju. Standardna lažna pravila su all, clean i install.

Make -- napredno Promenljive počinju sa znakom $ i nalaze se unutar zagrada ()

Make -- napredno Promenljive počinju sa znakom $ i nalaze se unutar zagrada () ili {}, a promenljive od jednog karaktera ne zahtevaju zagrade, na primer $(CC), $(CC_FLAGS), $@, $^ Automatske promenljive se postavljaju nakon što je prepoznato pravilo: $@ -- ime fajla odredišta $* $< -- ime fajla prvog preduslova $^ -- imena svih preduslova, razdvojenih bez dupliranja $+ -- isto kao gore, ali sa dupliranjima -- ime fajla odredišta bez ekstenzije $? -- imena svih preduslova novijih od odredišta, razdvojenih space-om

Make -- napredno Primer makefile-a od malopre: all: hello # $@ matches the target;

Make -- napredno Primer makefile-a od malopre: all: hello # $@ matches the target; $< matches the first dependent hello: hello. o gcc -o $@ $< hello. o: hello. c gcc -c $< clean: rm hello. o hello

Virtualna putanja Moguće je koristiti VPATH kako bi se specificirao direktorijum u kome se

Virtualna putanja Moguće je koristiti VPATH kako bi se specificirao direktorijum u kome se mogu tražiti preduslovi i odredišta (fajlovi). Na primer: # Search for dependencies and targets from "src" and "include" directories # The directories are separated by space VPATH = src include • Takođe, moguće je koristiti vpath kako bi se specificirao tip fajla koji se traži u direktorijumu. Na primer: # Search for. c files in "src" directory; . h files in "include" directory # The pattern matching character '%' matches filename without the extension vpath %. c src vpath %. h include

Šablonska pravila Šablonsko pravilo, koje koristi karakter poklapanja “%” umesto imena fajla, može se

Šablonska pravila Šablonsko pravilo, koje koristi karakter poklapanja “%” umesto imena fajla, može se primeniti kako bi se kreiralo odredište, ukoliko nema eksplicitnog pravila. Na primer: # Applicable for create. o object file. # '%' matches filename. # $< is the first pre-requisite # $(COMPILE. c) consists of compiler name and compiler options # $(OUTPUT_OPTIONS) could be -o $@ %. o: %. c $(COMPILE. c) $(OUTPUT_OPTION) $< # Applicable for create executable (without extension) from object. o object file # $^ matches all the pre-requisites (no duplicates) %: %. o $(LINK. o) $^ $(LOADLIBES) $(LDLIBS) -o $@

Primer makefile-a 1 # A sample Makefile # This Makefile demonstrates and explains #

Primer makefile-a 1 # A sample Makefile # This Makefile demonstrates and explains # Make Macros, Macro Expansions, # Rules, Targets, Dependencies, Commands, Goals # Artificial Targets, Pattern Rule, Dependency Rule. # Comments start with a # and go to the end of the line. # Here is a simple Make Macro. LINK_TARGET = test_me # Here is a Make Macro that uses the backslash to extend to multiple lines. OBJS = Test 1. o Test 2. o Main. o

Primer makefile-a 2 # Here is a Make Macro defined by two Macro Expansions.

Primer makefile-a 2 # Here is a Make Macro defined by two Macro Expansions. # A Macro Expansion may be treated as a textual replacement of the Make Macro. # Macro Expansions are introduced with $ and enclosed in (parentheses). REBUILDABLES = $(OBJS) $(LINK_TARGET) # Here is a simple Rule (used for "cleaning" your build environment). # It has a Target named "clean" (left of the colon ": " on the first line), # no Dependencies (right of the colon), # and two Commands (indented by tabs on the lines that follow). # The space before the colon is not required but added here for clarity. clean : rm -f $(REBUILDABLES) echo Clean done

Primer makefile-a 3 # There are two standard Targets your Makefile should probably have:

Primer makefile-a 3 # There are two standard Targets your Makefile should probably have: # "all" and "clean", because they are often command-line Goals. # Also, these are both typically Artificial Targets, because they don't typically # correspond to real files named "all" or "clean". # The rule for "all" is used to incrementally build your system. # It does this by expressing a dependency on the results of that system, # which in turn have their own rules and dependencies. all : $(LINK_TARGET) echo All done

Primer makefile-a 4 # There is no required order to the list of rules

Primer makefile-a 4 # There is no required order to the list of rules as they appear in the Makefile. # Make will build its own dependency tree and only execute each rule only once # its dependencies' rules have been executed successfully. # Here is a Rule that uses some built-in Make Macros in its command: # $@ expands to the rule's target, in this case "test_me". # $^ expands to the rule's dependencies, in this case three files # main. o, test 1. o, and test 2. o. $(LINK_TARGET) : $(OBJS) g++ -g -o $@ $^

Primer makefile-a 5 # Here is a Pattern Rule, often used for compile-line. #

Primer makefile-a 5 # Here is a Pattern Rule, often used for compile-line. # It says how to create a file with a. o suffix, given a file with a. cpp suffix. # The rule's command uses some built-in Make Macros: # $@ for the pattern-matched target # $< for the pattern-matched dependency %. o : %. cpp g++ -g -o $@ -c $<

Primer makefile-a 6 # These are Dependency Rules, which are rules without any command.

Primer makefile-a 6 # These are Dependency Rules, which are rules without any command. # Dependency Rules indicate that if any file to the right of the colon changes, # the target to the left of the colon should be considered out-of-date. # The commands for making an out-of-date target up-to-date may be found elsewhere # (in this case, by the Pattern Rule above). # Dependency Rules are often used to capture header file dependencies. Main. o : Main. h Test 1. h Test 2. h Test 1. o : Test 1. h Test 2. o : Test 2. h

Dependancies sources=$(wildcard *. c) objs=$(sources: . c=. o) all: result: $(objs) $(CC) -o $@

Dependancies sources=$(wildcard *. c) objs=$(sources: . c=. o) all: result: $(objs) $(CC) -o $@ $^ %. d: %. c @set -e; rm -f $@; $(CC) -M $(CPPFLAGS) $< > $@. $$$$; sed 's, ($*). o[ : ]*, 1. o $@ : , g' < $@. $$$$ > $@; rm -f $@. $$$$ -include $(sources: . c=. d) clean: rm result *. o

Dependancies Makefile segment prikazan na prethodnom slajdu omogućava automatsko prepoznavanje fajlova od kojih zavise

Dependancies Makefile segment prikazan na prethodnom slajdu omogućava automatsko prepoznavanje fajlova od kojih zavise fajlovi koji se kompajliraju, što omogućava automatsko pokretanje kompajliranja i povezivanja svaki put kada se bilo koji od tih fajlova promeni Primer bi bili. h fajlovi-promena nekog. h fajla ne bi izazvala ponovno kompajliranje fajlova koji zavise od njega Ručno dodavanje zavisnosti od. h fajlova takođe nije praktično jer se to mora onda raditi svaki put kada se doda #include “xxxx. h” direktiva u izvornom fajlu