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

n_petr na seznam.cz n_petr na seznam.cz
Pátek Duben 29 13:46:31 CEST 2005


Moc pěkný úvod, děkuji.

Milan Keršláger napsal(a):

>On Fri, Apr 29, 2005 at 12:42:32PM +0200, 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?
>>    
>>
>.so je Shared Object, cili sdilena knihovna
>.a je staticky linkovatelna knihovna
>
>Pri prekladu (resp. az pri linkovani) programu se staticke knihovny musi
>pripojit k vysledne binarce. POkud pouzijete dynamicke knihovny, je ve
>vysledne binarce jen odkaz (binarka je mensi a ruzne programy mohou
>sdilet jednu knihovnu umistenou v pameti). Nicmene pak musite mit v
>systemu pri spusteni k dispozici vsechny potrebne dynamicke knihovny.
>
>Kdyz se program spousti, zavadec zavede binarku a vsechny potrebne
>dynamicke knihovny. Zavadec musi take pri startu vyresit reference
>(odkazy na funkce z programu do knihovnu prevede ze symbolu na adresy) a
>urcit umisteni v pameti (na jakou adresu + relokace).
>
>.ko je neco jako .o (Object code), tj. polotovar, ktery vyleze z
>kompilatoru. Linker pak spoji vsechny .o do vysledneho binarniho
>programu. .ko je polotovar pro jadro (cili kus kodu, ktery se umisti do
>pameti v pripade potreby - treba ovladac - a rozsiri se tim schopnosti
>jadra).
>  
>
Linker a zavaděč je jedno a to samé? Každý ELF program má tedy svůj 
vlsatní linker?

>Nektere programy (napr. PHP, Apache) pouzivaji mechanismus, kdy behem
>sveho behu umeji nahrat do pameti dalsi rozsirujici kod (treba podpora
>databazi). Tento kod je taky ve forme .o
>
>Dynamicky zaveditelne objekty (za behu programu nebo jadra) maji silnou
>vazbu, takze je nelze libovolne kombinovat mezi ruznymi verzemi (nebo
>i mezi ruznymi pouzitymi kompilatory).
>
>ldconfig vytvari databazi dynamickych knihoven, ktere jsou umisteny v
>zakladnich adresarich (/lib, /usr/lib) a dalsich, ktere jsou uvedeny v
>/etc/ld.so.conf. Seznam je umisten do /etc/ld.so.cache a lze ho vypsat
>pomoci ldconfig -p.
>  
>
Pokud je v seznamu "/etc/ld.so.conf" adresář "/usr/lib64" natáhnou se i 
rekurzivně .so knihovny, které jsou např. v "/usr/lib64/sane", který sám 
o sobě v "/etc/ld.so.conf" není?

>ldd /cesta/k_programu umi vypsat, jake sdilene knihovny program
>potrebuje a take kde se v systemu nachazeji.
>
>Knihovny obsahuji cislo verze. To se sklada obvykle ze tri cisel -
>posledni je patchlevel (poradi opravy, zachovava binarni rozhrani).
>Prvni a druhe znaci velke a male cislo verze. Krome toho obsahuje
>knihovna jeste interni cislo rozhrani.
>
>  
>
Jestli jsem to dobře pochopil, tak v ld.so.cache, je pouze seznam na 
.so, které lze nahrávat do paměti a tento cache vypíšu pomocí "ldconfig 
-p". Jak tedy vylistuji seznam .so nalinkovaných v paměti, jestli to má 
vůbec smysl?

Jak jde .so manuálné přilinkovat do paměti, jestli to má vůbec smysl? 
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? Jde uskutečnit něco jako "modprobe 
libsane-sm3600.so vendor=0x5da product=0x40ca"?

Petr Novák
n_petr na seznam.cz




Další informace o konferenci Linux