Vyhledávání na webu

Pochopení sdílených knihoven v Linuxu


V programování je knihovna směs předkompilovaných částí kódu, které lze znovu použít v programu. Knihovny zjednodušují život programátorům tím, že poskytují opakovaně použitelné funkce, rutiny, třídy, datové struktury a tak dále (napsané jiným programátorem), které mohou používat ve svých programech.

Pokud například vytváříte aplikaci, která potřebuje provádět matematické operace, nemusíte pro to vytvářet novou matematickou funkci, můžete jednoduše použít existující funkce v knihovnách pro daný programovací jazyk.

Příklady knihoven v Linuxu zahrnují libc (standardní knihovna C) nebo Glibc (verze GNU standardní knihovny C), libcurl (soubor s více protokoly transfer library), libcrypt (knihovna používaná pro šifrování, hashování a kódování v C) a mnoho dalších.

Linux podporuje dvě třídy knihoven, a to:

  • Statické knihovny – jsou svázány s programem staticky v době kompilace.
  • Dynamické nebo sdílené knihovny – jsou načteny při spuštění programu a načtení do paměti a vazba nastane za běhu.

Dynamické nebo sdílené knihovny lze dále kategorizovat do:

  • Dynamicky propojené knihovny – zde je program propojen se sdílenou knihovnou a jádro po spuštění načte knihovnu (v případě, že není v paměti).
  • Dynamicky načtené knihovny – program přebírá plnou kontrolu voláním funkcí s knihovnou.

Konvence pojmenování sdílených knihoven

Sdílené knihovny jsou pojmenovány dvěma způsoby: jménem knihovny (a.k.a soname) a „filename“ (absolutní cesta k souboru, který ukládá kód knihovny).

Například soname pro libc je libc.so.6: kde lib je předpona, c je popisný název, takže znamená sdílený objekt, a 6 je verze. A jeho název souboru je: /lib64/libc.so.6. Všimněte si, že soname je ve skutečnosti symbolický odkaz na název souboru.

Vyhledání sdílených knihoven v Linuxu

Sdílené knihovny načítají ld.so (nebo ld.so.x) a ld-linux.so (nebo ld- linux.so.x), kde x je verze. V Linuxu /lib/ld-linux.so.x prohledává a načítá všechny sdílené knihovny používané programem.

Program může volat knihovnu pomocí jejího názvu knihovny nebo názvu souboru a cesta ke knihovně ukládá adresáře, kde lze knihovny v souborovém systému nalézt. Ve výchozím nastavení jsou knihovny umístěny v /usr/local/lib, /usr/local/lib64, /usr/lib a /usr/lib64; spouštěcí knihovny systému jsou v /lib a /lib64. Programátoři však mohou instalovat knihovny do vlastních umístění.

Cestu ke knihovně lze definovat v souboru /etc/ld.so.conf, který můžete upravit pomocí editoru příkazového řádku.

vi /etc/ld.so.conf 

Řádky v tomto souboru přikazují jádru načíst soubor v /etc/ld.so.conf.d. Tímto způsobem mohou správci balíčků nebo programátoři přidávat své vlastní adresáře knihoven do vyhledávacího seznamu.

Pokud se podíváte do adresáře /etc/ld.so.conf.d, uvidíte soubory .conf pro některé běžné balíčky (kernel, mysql a postgresql v tento případ):

ls /etc/ld.so.conf.d

kernel-2.6.32-358.18.1.el6.x86_64.conf  kernel-2.6.32-696.1.1.el6.x86_64.conf  mariadb-x86_64.conf
kernel-2.6.32-642.6.2.el6.x86_64.conf   kernel-2.6.32-696.6.3.el6.x86_64.conf  postgresql-pgdg-libs.conf

Pokud se podíváte na mariadb-x86_64.conf, uvidíte absolutní cestu ke knihovnám balíčků.

cat mariadb-x86_64.conf

/usr/lib64/mysql

Výše uvedená metoda nastaví cestu knihovny trvale. Chcete-li ji dočasně nastavit, použijte proměnnou prostředí LD_LIBRARY_PATH na příkazovém řádku. Pokud chcete, aby změny zůstaly trvalé, přidejte tento řádek do inicializačního souboru shellu /etc/profile (globální) nebo ~/.profile (specifický pro uživatele).

export LD_LIBRARY_PATH=/path/to/library/file

Správa sdílených knihoven v Linuxu

Podívejme se nyní na to, jak zacházet se sdílenými knihovnami. Chcete-li získat seznam všech závislostí sdílené knihovny pro binární soubor, můžete použít nástroj ldd. Výstup ldd je ve tvaru:

library name =>  filename (some hexadecimal value)
OR
filename (some hexadecimal value)  #this is shown when library name can’t be read

Tento příkaz zobrazuje všechny závislosti sdílené knihovny pro příkaz ls.

ldd /usr/bin/ls
OR
ldd /bin/ls
Ukázkový výstup
	linux-vdso.so.1 =>  (0x00007ffebf9c2000)
	libselinux.so.1 => /lib64/libselinux.so.1 (0x0000003b71e00000)
	librt.so.1 => /lib64/librt.so.1 (0x0000003b71600000)
	libcap.so.2 => /lib64/libcap.so.2 (0x0000003b76a00000)
	libacl.so.1 => /lib64/libacl.so.1 (0x0000003b75e00000)
	libc.so.6 => /lib64/libc.so.6 (0x0000003b70600000)
	libdl.so.2 => /lib64/libdl.so.2 (0x0000003b70a00000)
	/lib64/ld-linux-x86-64.so.2 (0x0000561abfc09000)
	libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003b70e00000)
	libattr.so.1 => /lib64/libattr.so.1 (0x0000003b75600000)

Protože sdílené knihovny mohou existovat v mnoha různých adresářích, prohledávání všech těchto adresářů při spuštění programu by bylo značně neefektivní: což je jedna z pravděpodobných nevýhod dynamických knihoven. Proto je použit mechanismus cachování, který provádí program ldconfig.

Ve výchozím nastavení ldconfig čte obsah /etc/ld.so.conf, vytváří příslušné symbolické odkazy v adresářích dynamických odkazů a poté zapisuje mezipaměť do /etc/ld.so.cachekterý je pak snadno použitelný jinými programy.

To je velmi důležité zejména tehdy, když jste právě nainstalovali nové sdílené knihovny nebo vytvořili vlastní nebo vytvořili nové adresáře knihoven. Chcete-li provést změny, musíte spustit příkaz ldconfig.

ldconfig
OR
ldconfig -v 	#shows files and directories it works with

Po vytvoření sdílené knihovny ji musíte nainstalovat. Můžete jej buď přesunout do libovolného z výše uvedených standardních adresářů a spustit příkaz ldconfig.

Případně spusťte následující příkaz a vytvořte symbolické odkazy z soname na název souboru:

ldconfig -n /path/to/your/shared/libraries

Chcete-li začít s vytvářením vlastních knihoven, podívejte se na tuto příručku z The Linux Documentation Project (TLDP).

To je prozatím vše! V tomto článku jsme vám poskytli úvod do knihoven a vysvětlili sdílené knihovny a jak je spravovat v Linuxu. Pokud máte nějaké dotazy nebo další nápady, o které se chcete podělit, použijte níže uvedený formulář pro komentáře.