Produkty Novinky Články Návody Kontakty

Systémové knihovny

Sada systémových knihoven vytváří pro uživatelské programy v Linuxu standardní běhové prostředí. Proto systémové knihovny tvoří nezbytnou součást naší linuxové distribuce. Jednotlivé knihovny si stručně představíme, abychom lépe pochopili jejích účel.
V běžné linuxové distribuci je sada systémových knihoven poněkud obsáhlá - stačí si prohlédnout obsah adresáře /lib. Zjistíme, že zde není pouze knihovna GNU libc (zkráceně glibc nebo také jen libc) a její komponenty, ale i řada dalších knihoven. Naštěstí ne všechny knihovny jsou naprosto nezbytné. V opravdu minimalistických distribucích, kde jsou binárky příkazů (unixové a shellové utility) nahrazeny Busyboxem, dokonce postačí k běhu systému pouze knihovna libc (při statickém linkování). A i ta je pro některé vývojáře příliš velká a obecná a nahrazují ji její zmenšenou verzí - knihovnou uClibc, která obsahuje optimalizovanou sadu standardních funkcí jazyka C.
Minimalistický přístup v případě sady knihoven okolo libc však má i své nevýhody. Chybějící knihovny a minimalizovaná knihovna uClibc vytváří řadu omezení pro běh uživatelských aplikací, které pak nemohou využívat různé knihovní funkce jinak běžně dostupné. Navíc knihovnu uClibc si musíme nakonfigurovat a sestavit. Je to proto na zvážení, zda se tento přístup v celkovém pohledu vyplatí. Pádným argumentem v neprospěch dalšího zmenšování distribuce cestou použití uClibc místo standardní knihovny libc je i to, že kapacita FLASH pamětí používaných v embedded zařízení je dnes už více než dostatečná. Je pak otázkou, zda má smysl se snažit linuxovou distribuci zmenšit ještě o pár stovek kilobytů, když to není nezbytně nutné.
Z uvedených důvodů nepůjdeme minimalistickou cestou a nebudeme se zabývat konfigurací a sestavením knihovny uClibc. Stejně tak se nebudeme snažit omezit sadu systémových knihoven na naprosté minimum. Dokonce systémové knihovny bez rozpaků ”ukradneme” přímo z našeho linuxového pracovního počítače (jen pro připomenutí - předpokládáme distribuci Debian 6.0 Squeeze).
Nyní si pojďme stručně představit knihovny, které budou součástí naší minimalistické distribuce. ”Vykrádat” je budeme z adresáře /lib z v našem linuxovém pracovním počítači. Cílovým adresářem bude adresář lib/ v adresáři mylindist-root/, který je kořenovým adresářem naší vznikající distribuce.
V seznamu potřebných knihoven vždy každou knihovnu stručně představíme a uvedeme soubory, které si musíme zkopírovat.

Základní sada knihoven

Knihovna ld
Knihovna ld je dynamický linker nutný pro přilinkovávání dynamických knihoven ke spouštěným programům.
Soubor:
ld-2.11.2.so
Knihovna libBrokenLocale
Obsahuje sadu rutin pomocí, kterých mohou programy obejít problémy s nefungující/porušenou lokalizací.
Soubor:
libBrokenLocale-2.11.2.so
Knihovna libanl
Je knihovna rutin pro asynchronní vyhledávání jmen.
Soubor:
libanl-2.11.2.so
Knihovna libc
Je standardní knihovna jazyka C, která poskytuje zapouzdření systémových volání a poskytuje základní knihovní funkce, tak jak je definuje standard jazyka C. Je nezbytná pro běh většiny uživatelských programů.
Soubor:
libc-2.11.2.so
Knihovna libcind
Knihovna používaná pro práci s mezinárodními názvy domén (např. knihovna libc ji vyžaduje pro funkci getaddrinfo())
Soubor:
libcidn-2.11.2.so
Knihovna libcrypt
Knihovna obsahuje rutiny pro kryptografické funkce používané většinou programů pro autentifikaci.
Soubor:
libcrypt-2.11.2.so
Knihovna libdl
Zde jsou umístěny rutiny potřebné pro dynamické nahrávání sdílených objektů (např. pomocí funkce dlopen()).
Soubor:
libdl-2.11.2.so
Knihovny libm
Knihovna s matematickými funkcemi.
Soubor:
libm-2.11.2.so
Knihovny libnss*
Sada knihoven s funkcemi pro přístup k systémovým databázím s hesly, názvy počítačů, seznamu použitých protokolů apod.).
Soubory:
libnsl-2.11.2.so 
libnss_compat-2.11.2.so 
libnss_dns-2.11.2.so 
libnss_files-2.11.2.so 
libnss_hesiod-2.11.2.so 
libnss_nis-2.11.2.so 
libnss_nisplus-2.11.2.so 
Knihovna libpthread
Knihovna s funkcemi potřebnými pro běh vícevláknových aplikací dle standardu POSIX.
Soubor:
libpthread-2.11.2.so
Knihovna libresolv
Obsahuje funkce pro komunikaci s DNS servery (překlad IP adres na doménová jména).
Soubor:
libresolv-2.11.2.so
Knihovna librt
Knihovna s rutinami real-time rozšíření POSIXu.
Soubor:
librt-2.11.2.so
Knihovna libutil
Knihovna funkcí využívaných řadou unixových utilit.
Soubor:
libutil-2.11.2.so

Rozšířená sada knihoven

Kromě uvedených knihoven, které tvoří základní sadu, je vhodné si do RFS nakopírovat i další knihovny, které slouží pro statistické a ladící účely. Celkově zabírají pod 100kB, takže velikost RFS rozhodně zásadně nezvětší. Naproti tomu mohou pomoci při odhalování chyb uživatelské aplikace.
Knihovna libSegfault
Pomocí této knihovny a skriptu catchsegv je možné vysledovat místo pádu programu kvůli porušení ochrany paměti (segmentation fault).
Soubor:
libSegFault.so
Knihovna libmemusage
Knihovna pro sledování využití haldy a zásobníku.
Soubor:
libmemusage.so
Knihovna libpcprofile
Knihovna pro sledování spotřebovaného času CPU uživatelským programem.
Soubor:
libpcprofile.so
Knihovna libpthread_db
Knihovna potřebná pro ladění vícevláknových aplikací (využívaní gdb).
Soubor:
libpthread_db-1.0.so

Instalace knihoven

Všechny uvedené soubory knihoven včetně symbolických odkazů nakopírujeme z adresáře /lib distribuce Debian do adresáře lib/ sestavované distribuce.
Uvedené knihovny jsou dynamické, tzn. že pro jejich zavedení do paměti a přilinkování ke spuštěné aplikaci potřebujeme služby dynamického zavaděče ld. Dynamický zavaděč musí každou knihovnu, kterou má zavést do paměti, nejprve vyhledat v adresářové struktuře. Pro urychlení vyhledávání je vhodné vytvořit setříděný seznam knihoven s jejich umístěním - soubor /etc/ld.so.cache. Tento soubor vytvoříme pomocí příkazu ldconfig. Příkaz ldconfig prohledá výchozí adresáře se systémovými knihovnami: /lib a /usr/lib a také soubor /etc/ld.so.conf, kde jsou případně uvedeny další adresáře s knihovnami. My však musíme příkaz ldconfig přesměrovat do kořenového adresáře naší distribuce, tedy do adresáře mylindist-root. Volání příkazu (jako superuživatel root) pak vypadá nějak takto:
# ldconfig -v -r /home/emlin/mylindist-root/
kde volba -v zajistí výpis podrobných informací o nalezených knihovnách a vytvořeném seznamu. Volba -r s parametrem cesty ke kořenovému adresáři přesměruje ldconfig do adresáře s naší distribucí.
Výsledkem je soubor etc/ld.so.cache, který ldconfig vytvořil a uložil do adresáře etc/ v naší distribuci. Je možné si jej prohlédnout obyčejným editorem - měl by obsahovat názvy systémových knihoven v naší distribuci a řadu nesmyslných znaků. Kromě toho ldconfig vytvoří i symbolické odkazy na soubory knihoven. K čemu jsou dobré, si povíme za chvíli.
Výstup příkazu ldconfig je patrný z obrázku 1.2
obrázek vystup-prikazu-ldconfig
Obrázek 1.2 Výstup příkazu ldconfig

Verze knihoven

Jak jsme se zmínili dříve, příkaz ldconfig kromě vybudování setříděného seznamu, vytvoří k většině knihoven i symbolický odkaz na soubor knihovny. Např. pro knihovnu libc-2.11.2.so vytvoří ldconfig symbolický odkaz libc.so.6. Symbolický odkaz dědí své jméno po tzv. soname (shared object name), který definuje název knihovny a její verzi a je zakompilovaný do souboru knihovny. Verze knihovny v soname určuje defakto verzi rozhraní knihovny. Každá knihovna, která je s tímto rozhraním kompatibilní, může být v systému nasazena bez nutnosti překompilovávat aplikace. Ty jsou totiž linkovány vůči symbolickému odkazu na knihovnu a nikoliv vůči samotné knihovně. Proto při vydání opravy není nutné s aplikacemi cokoliv dělat. Stačí jen instalovat novější verzi knihovny se stejným soname. Takže například knihovna libc-2.11.2.so může být nahrazena knihovnou libc-2.11.3.so. Aplikace nic nepoznají, protože symbolický odkaz je přesměrován na novější knihovnu.
Zároveň je možné díky konceptu soname držet v systému více verzí knihoven, resp. více knihoven podporujících více verzí rozhraní.