Binární soubory samy vědí, na které verzi sdílené knihovny jsou závislé, a konkrétně si ji vyžádají. Můžete použít ldd
ukázat závislosti; moje za ls
jsou:
$ ldd /bin/ls
linux-gate.so.1 => (0xb784e000)
librt.so.1 => /lib/librt.so.1 (0xb782c000)
libacl.so.1 => /lib/libacl.so.1 (0xb7824000)
libc.so.6 => /lib/libc.so.6 (0xb76dc000)
libpthread.so.0 => /lib/libpthread.so.0 (0xb76c3000)
/lib/ld-linux.so.2 (0xb784f000)
libattr.so.1 => /lib/libattr.so.1 (0xb76bd000)
Jak vidíte, ukazuje to např. libpthread.so.0
, nejen libpthread.so
.
Důvodem symbolického odkazu je linker. Když chcete odkazovat proti libpthread.so
přímo, dáte gcc
příznak -lpthread
a přidá na lib
prefix a .so
přípona automaticky. Nemůžete mu přikázat, aby přidal na .so.0
přípona, takže symbolický odkaz ukazuje na nejnovější verzi lib, aby to bylo usnadněno
Čísla ve sdílených knihovnách jsou konvence používaná v Linuxu k identifikaci API knihovny. Typický formát je:
libFOO.so.MAJOR.MINOR
A jak jste si všimli obvykle, existuje symbolický odkaz z libFOO.so na libFOO.so.MAJOR.MINOR. ldconfig je zodpovědný za aktualizaci tohoto odkazu na nejnovější verzi.
Hodnota MAJOR se obvykle zvýší, když se změní rozhraní API (jsou odstraněny nové vstupní body nebo se změní parametry nebo typy). MINOR se obvykle zvyšuje pro vydání oprav chyb nebo když jsou zavedena nová rozhraní API, aniž by došlo k porušení stávajících rozhraní API.
Rozsáhlejší diskusi naleznete zde:Rozebírání sdílených knihoven
Sdílené knihovny by měly být verzovány podle následujícího schématu:
blah.so.X.Y.Z
kde
- X =zpětně nekompatibilní vydání ABI
- Y =zpětně kompatibilní vydání ABI
- Z =Pouze interní změny – žádná změna rozhraní ABI
Obvykle vidíte pouze první číslici, například hello.so.1
protože první číslice je jediná věc potřebná k identifikaci "verze" knihovny, protože všechny ostatní číslice jsou zpětně kompatibilní.
ldconfig
udržuje tabulku toho, jaké sdílené knihovny jsou v systému dostupné a kde existuje cesta k této knihovně. Můžete to ověřit spuštěním:
ldconfig -p
Když je balíček vytvořen pro něco jako Red Hat, sdílené knihovny vyvolávané v binárním formátu budou vyhledány a přidány jako závislosti balíčku v době sestavení RPM. Když tedy přejdete k instalaci balíčku, instalační program vyhledá, zda hello.so.1
je nainstalován v systému zaškrtnutím ldconfig
.
Závislosti balíčku můžete vidět tak, že uděláte něco jako:
rpm -qpR hello.rpm
Tento systém (na rozdíl od Windows) umožňuje více verzí hello.so
být nainstalován v systému a být používán různými aplikacemi současně.