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