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