Jak funguje demand paged loading spolecne s dynamickym linkovanim ?
mitr na email.cz
mitr na email.cz
Středa Březen 24 20:43:28 CET 1999
Frantisek Dufka <dufkaf na merit.cz> napsal:
> Dobry den,
Dobry den,
> tak nejak si neumim predstavit subj.
> U staticky linkovanych exacu je to jasny - kod i data jsou v exaci
zarovnane na
> velikost stranky a naswapujou se do pameti pri page faultu primo z exace
stejne
> jako by to bylo ze swapu.
>
> Jak do toho ale sedi dynamicke linkovani ? Kdy se vyresi symbolicke
odkazy ?
> Nacte se exac do pameti cely (takze zadne 'on demand') nebo se to resi
nejak za
> behu ? Jak je to cele efektivni (rychle) oproti statickemu likovani ?
(nemyslim
> rozdil v normalnim a -fPIC kodu, ale primo rezii dynamickeho linkovani)
>
> Me tak z hlavy napadlo, ze bych vsecky nevyresene dynamicke odkazy nechal
> ukazovat na adresu treba 0 a pak osetroval vyjimku a v ni vyresil ten
dynamicky
> odkaz. Nevim nakolik by to bylo efektivni (a taky by to asi musel delat
primo
> kernel), takze to asi neni uplne ono. Jak se to dela skutecne ?
Je to skoro tak - v read-write sekci souboru (mluvim jen o ELF, o
ostatnich typech spustitelnych programu nic moc nevim) je tzv. Global
Offset Table (GOT), do ktere se zapisuji tyto adresy. Dale je v read-only
sekci tzv. Procedure Linkage Table (PLT), ktera vypada zhruba takto:
printf: jmp *printf_GOT
printf_1: pushl $printf_rel_ofs
jmp common
... pro dalsi rutiny
common: pushl 4(GOT)
jmp *8(GOT)
Takze kdyz vas program zavola printf, zacne se provadet odpovidajici
polozka PLT. Ta skoci na adresu, ktera je udana v odpovidajici polozce GDT
(pritf_GOT). Tato polozka v GOT je inicializovana adresou printf_1. Ta
ulozi na zasobnik offset v tabulce relokaci (je tam receno, ze se hleda
hodnota symbolu 'printf' a ze se ma ulozit do printf_GOT) a pokracuje
kodem spolecnym pro vsechny polozky PLT (common). Ten podle definice ulozi
na zasobnik druhou polozku GOT a zavola rutinu na adrese udane treti
polozkou. Tyto polozky naplnuje dynamicky linker tak, aby se tim vyvolal
jeho kod. No a dynamicky linker podle dat, ktere ma k dispozici, prepise
printf_GOT realnou adresou funkce printf ve sdilene knihovne, a rovnou ji
zavola.
Pri pristich volanich funkce se znovu vola polozka z PLT, ktera ale primo
prenese rizeni na adresu uvedenou v GOT.
> Jiste,ze mohu zacit studovat zdrojaky ld-linux.so, neumel by to nekdo z
vas
> vysvetlit nejak jednoduse, nebo me alespon nekam nasmerovat?
Ten muj vyklad asi nebyl moc srozumitelny... Definice standardu by mela
byt (podle archivu Infomagicu z ledna 1988 - omlouvam se, pokud je to
nekde jinde) na ftp://tsx-11.mit.edu/packages/GCC/ELF.doc.tar.gz
Mirek
--- CREATED BY ATC O..R..G..A..N..I..Z..E..R
--- http://email.cz <--- Get Your Free Email
Další informace o konferenci Linux