Re: Jak nahrát .so knihovnu a jak vlastně funguje?

Pavel Kankovsky peak na argo.troja.mff.cuni.cz
Neděle Květen 1 16:30:10 CEST 2005


On Fri, 29 Apr 2005, n_petr na seznam.cz wrote:

> Můžete mi prosím vysvětlit, jak manuálně nahrát .so soubor a jak vlastně 
> .so soubory fungují a k čemu jsou? Díval jsem se na google a moc moudrý 
> z toho nejsem.
> - .so a .a jsou něco jako knihovny nebo moduly či ovladače?

Jak uz bylo receno, .so = shared object, tedy de facto sdilena knihovna,
soubor s binarnim kodem prizpusobeny k tomu, aby mohl byt dynamicky 
cili za chodu linkovan do jinych programu.

Jinak .a = archive. Je to ve skutecnosti v zasade obecny balik obecnych
souboru, se kterym lze pracovat prikazem ar(1) (btw, debianovske baliky
pouzivaji interne tenhle format), ktery se obvykle pouziva k zabaleni
vetsiho mnozstvi souboru .o = object do jednoho, pricemz pro vetsi 
efektivitu pouziti se obvykle jeste vytvari index symbolu (viz ranlib(1)).

(Jen tak mimochodem, nektere nelinuxove systemy, mam dojem, ze napr.  
starsi verze AIX, maji i dynamicke knihovny ve formatu ar.)

> *) Vše se řídí přes /etc/ld.so.conf, kde jsou zřejmě adresáře, ze 
> kterých se tahají .so knihovny

Ne tak docela. ld.so.conf ridi praci programu ldconfig, ktery vytvari
soubor /etc/ld.so.cache, kde je globalni seznam instalovanych dynamickych
knihoven. Ovsem dynamicky linker pracuje komplikovaneji a hleda dynamicke
knihovny i na jinych mistech (viz ld.so(8)).

> 1) Pokud je v seznamu adresář /usr/lib64 natáhnou se i rekurzivně .so 
> knihovny, které jsou např. v /usr/lib64/sane?

Ne. Viz ldconfig(1). Tedy ony se vlastne nenatahuji, ale pouze pridavaji 
do seznamu, ktery ldconfig generuje.

> 2) Jaký je přesně rozdíl mezi .so (dynamickou) a .a (statickou) 
> knihovnou? (uvažujme kernel 2.6.x, pokud na to je 2.4.x jinak)

Kernel v tom nehraje zadnou roli (tedy kdysi se v tom trochu angazoval,
ale to uz je davno pryc). Zbytek uz snad vysvetlil kolega Kerslager.

> 3) Které knihovny se kdy a proč natahují do systému? Po startu PC nebo 
> až je zavolá nějaký program?

Zalezi na tom, cemu rikate "do systemu". Knihovny musi v dobe sveho 
pouziti lezet "v systemu" nekde v souborovem systemu.

> 4) Co je vůbec zač ta knihovna? Vypadá navenek jako ELF binární soubor 
> (spustitelný program).

ELF je obecny format umoznujici popsat ruzne druhy souboru obsahujicich 
spustitelny kod, pocinaje primo spustitelnymi programy, pres dynamicke 
knihovny (.so), az po jednotlive prelozene moduly (.o). Staticka knihovna, 
tedy .a, neni primo ELF, ale balik prelozenych modulu .o.

> 5) Pokud je .so (.a) knihovna něco jako ovladač (.ko), jde na ní udělat 
> nějaký odkaz, aby se dala natáhnout pomocí "modprobe" (případně "insmod")?

To je otazka zhruba ve stylu "kdyz motor, muzu ho nainstalovat do sveho
traktoru?" .ko, neboli modul urceny pro jadro, se sice podoba kusu kodu 
urcenemu pro userland, ale kdy se to pokusite mixovat dohromady, tak to 
vetsinou bude nekde dost skripat.

> 6) Když mám .so knihovnu jde nějak překonvertovat na .a knihovnu a taky 
> opačně, t.j. z .a na .so?

V zasade to lze. Konverzi .a -> .so bych zvladnul i se standardnimi
nastroji, v opacnem smeru by mozna bylo potreba jiste nasili. Ale obvykle
je lepsi to nedelat, mj. z toho duvodu, ze dynamicke knihovny jsou
prekladany specialnim zpusobem, aby je bylo mozno snadno relokovat (tzv.
PIC = Position Independent Code).


On Fri, 29 Apr 2005, n_petr na seznam.cz wrote:

> Linker a zavaděč je jedno a to samé? Každý ELF program má tedy svůj 
> vlsatní linker?

Kdy se spusti ELFovy program, tak jadro do pameti namapuje jeho vlastni 
spustitelny soubor podle informaci v jeho hlavickach. Zaroven volitelne 
namapuje dalsi spustitelny soubor, na ktery odkazuje sekce ".interp"
(viz vystup z objdump). To je obvykle dynamicky linker, na soucasnem 
Linuxu standardne /lib/ld-linux.so.2, ktery natahne potrebne knihovny,
cele to sestavi dohromady a spusti vlastni program.

Zavadec je tedy kod v jadre + dynamicky linker.

Linker je obecne oznaceny pro program, ktery sestavuje jine programy.
Ale vetsinou se tim, kdyz je to uvedeno bez privlastku, asi mini 
samostatny linker (ld(1)) a ne dynamicky linker.

> Jak jde .so manuálné přilinkovat do paměti, jestli to má vůbec smysl? 

Viz dlopen(3). Ale na to jste se asi neptal.

> Proč se na to ptám? >>> sane mi nechce připojit "libsane-sm3600.so", aby 
> mi začal fungovat scanner. Pokud ji linkuje správně a já o tom jen 
> nevím, jde to nějak ověřit?

Mozna by bylo lepsi, kdybyste se sveril s presnym znenim chyboveho 
hlaseni.

> Jde uskutečnit něco jako "modprobe libsane-sm3600.so vendor=0x5da
> product=0x40ca"?

Kdyz budete mist dost velke kladivo, tak dostanete i hranate koliky do 
kulatych otvoru. Ale fungovat to moc nebude. Nemuzete jen tak vzit kus 
kodu urceny pro praci v jednom prostredi (Sane) a nacpat ho do jineho 
prostredi (jadro).


--Pavel Kankovsky aka Peak  [ Boycott Microsoft--http://www.vcnet.com/bms ]
"Resistance is futile. Open your source code and prepare for assimilation."



Další informace o konferenci Linux