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