linker i punioci Flashcards
Sta je povezivanje?
Kombinovanje vise objektih fajlova u jedan fajl koji moze da se ucita u memoriju i/ili izvrsi
Kada moze da se izvrsi povezivanje?
1) U vreme kompajliranja [prevoddimo iz izvornog u masinski kod]
2) U vreme ucitavanja [kada imamo biblioteke koje hocemo da delimo]
3) u vreme izvrsavanja
Sta moze da dodje na ulaz linkera?
1) objektni fajlovi
2) deljene biblioteke
3) obicne biblioteke
4) parametri komande [razne opcije koje mu zadajemo upucuju sta da radi linker]
5)skript fajl
Sta moze da dobijemo na izlazu iz linkera?
1) izvrsni fajl
2) deljenu biblioteku
3) mapu povezivanja [informacije o tome kako je povezao ulazne fajlove]
Koje su dve glavne funkcije linkera?
1)razresavanje simbola
2)realokacija
Sta je razresavanje simbola?
Povezuje svaku referencu simbola sa tacno jednom definicijom
Sta je realokacija?
Sve reference simbola pokazuje im na koju adresu treba da gadjaju da bi nasli ono sto im treba
Koje greske mogu da se jave pri razresavanju simbola?
1) simbol je vec definisan
2) simbol nije uopste definisan
Sta sve moze da se desi kod razresavanja simbola?
1)simbol ima tacno 1 def
2)simb nije def u tekucem modulu
3) simbol nije def
4)globalni simbol je vise puta definisan
Kojom komandom linker ispisuje gresku ako smo imali vise def za jedan simbol?
-fno-common
Kakvi mogu biti globalni simboli?
Mogu biti jaki ili slabi
Koji simboli su jaki?
Globalne promenljive koje su inicijalizovane i funkcije
Koji simboli su slabi?
Neinicijalizovane globalne promenljive
Pravila za visestruku definiciju simbola po kojoj se odredjuje def simbola?
1) nema vise jakih def za jedan simbol
2) ako imamo jaki i vise slabih def, biramo jaki
3) ako imamo vise slabih def, biramo jednu od njih
Sta je staticka biblioteka?
Svi objektini fajlovi mogu umesto da se linkuju da se spakuju u jednu datoteku i to se naziva staticka biblioteka
Da li koristimo celu staticku biblioteku?
Ne linker koristi samo one delove koji se koriste iz te biblioteke
U kom formatu su staticke biblioteke?
Format arhive, njegovi fajlovi imaju ekstenziju .a
Kako pravimo arhivu?
gcc -c fajl1.c fajl2.c
ar rsc arhiva.a fajl1.o fajl2.o
Kako linker koristi staticke biblioteke da razresi reference?
Sa komandne linije cita jedan po jedan fajl(f)/arhivu(a) i popunjava skupove:
-skup E: fajlovi koji ce biti spojeni u izvrsavanje
-skup U: nerazreseni simboli
-skup D: definisani simboli
-u pocetku su E,U,D prazni
1) ako imamo f onda azurira skupove E,U i D
2) ako imamo a, pokusava da razresi simbole iz U, ako uspe azurira E,U,D
Da li je redosled fajlova na komandonoj liniji znacajan ?
Jeste, po pravilu biblioteke bi trebale da idu skroz na kraju, i ako imamo kruzni poziv u arhivama, onda cemo neke arhive da navedemo vise puta u komandnoj liniji kako bismo razresili sve simbole
Koje korake ima faza realokacije?
1) realokacija sekcija i definicija simbola (dodeljivanje memorije i spajanje sekcija)
2) realokacija referenci simbola (racunanje ofseta skokova i njihovih stvarnih adresa)
Realokacija sekcija?
Linker ovde prvo spoji sve sekcije, tako sto ih spaja po tipu; Zatim dodeli run-time memorijske lokacije svakoj sekciji i simbolu koji je definisan
Izvrsni fajl ELF ima dodatne sekcije?
Ima .init gde se nalazi mala funkcija _init() koju poziva inicijalizovani kod programa
Zaglavlje ELF fajla?
Tu imamo:
1) off - odakle pocinje kod od pocetka fajla
2) vaddr/paddr -adresa u memoriji od koje se pocinje
3) align - poravnanje za pocetnu adresu
4) filesz - velicina segmenta fajla
5) memsz -velicina segmenta memorije
6) flags - prava pristupa segmenta tokom izvrsavanja