A megosztott könyvtárak megértése Linuxban
A programozásban a könyvtár az előre lefordított kódrészletek választékát jelenti, amelyek újra felhasználhatók egy programban. A könyvtárak leegyszerűsítik a programozók életét, mivel újrafelhasználható függvényeket, rutinokat, osztályokat, adatstruktúrákat és így tovább biztosítanak (más programozó által írt), amelyeket felhasználhatnak a programjaikban.
Például, ha olyan alkalmazást készít, amelynek matematikai műveleteket kell végrehajtania, akkor ehhez nem kell új matematikai függvényt létrehoznia, egyszerűen használhatja az adott programozási nyelvhez tartozó könyvtárak meglévő függvényeit.
Példák a Linux könyvtáraira: libc (a szabványos C-könyvtár) vagy Glibc (a szabványos C-könyvtár GNU-változata), libcurl (multiprotocol fájl átviteli könyvtár), libcrypt (titkosításhoz, kivonatoláshoz és kódoláshoz használt könyvtár C nyelven) és még sok más.
A Linux két könyvtárosztályt támogat, nevezetesen:
- Statikus könyvtárak – a fordításkor statikusan hozzá vannak kötve egy programhoz.
- Dinamikus vagy megosztott könyvtárak – egy program indításakor töltődnek be, és betöltődnek a memóriába, és futás közben megtörténik az összerendelés.
A dinamikus vagy megosztott könyvtárak további kategóriákba sorolhatók:
- Dinamikusan kapcsolt könyvtárak – itt egy program a megosztott könyvtárhoz kapcsolódik, és a kernel betölti a könyvtárat (ha nincs a memóriában) végrehajtáskor.
- Dinamikusan betöltött könyvtárak – a program teljes mértékben átveszi az irányítást azáltal, hogy függvényeket hív meg a könyvtárral.
Megosztott könyvtárak elnevezési konvenciói
A megosztott könyvtárakat kétféleképpen nevezik el: a könyvtárnév (más néven soname) és egy „fájlnév” (a könyvtárkódot tároló fájl abszolút elérési útja).
Például a libc soname értéke libc.so.6: ahol a lib az előtag, a A >c egy leíró név, tehát megosztott objektumot jelent, a 6 pedig a verzió. A fájl neve pedig: /lib64/libc.so.6. Vegye figyelembe, hogy a soname valójában egy szimbolikus hivatkozás a fájlnévre.
Megosztott könyvtárak keresése Linuxban
A megosztott könyvtárakat az ld.so (vagy ld.so.x) és az ld-linux.so (vagy ld-) tölti be. linux.so.x) programok, ahol az x a verzió. Linuxban a /lib/ld-linux.so.x megkeresi és betölti a programok által használt összes megosztott könyvtárat.
Egy program a könyvtárnév vagy fájlnév használatával hívhat meg egy könyvtárat, a könyvtár elérési útja pedig olyan könyvtárakat tárol, ahol a könyvtárak megtalálhatók a fájlrendszerben. Alapértelmezés szerint a könyvtárak a következő helyen találhatók: /usr/local/lib, /usr/local/lib64, /usr/lib és /usr/lib64; A rendszerindítási könyvtárak a /lib és a /lib64 könyvtárban találhatók. A programozók azonban telepíthetnek könyvtárakat egyedi helyekre.
A könyvtár elérési útja az /etc/ld.so.conf fájlban határozható meg, amelyet parancssori szerkesztővel szerkeszthet.
vi /etc/ld.so.conf
A fájl sorai arra utasítják a kernelt, hogy töltse be a fájlt a /etc/ld.so.conf.d fájlba. Így a csomagkarbantartók vagy programozók hozzáadhatják egyéni könyvtári könyvtáraikat a keresési listához.
Ha belenéz az /etc/ld.so.conf.d könyvtárba, akkor .conf fájlokat fog látni néhány gyakori csomaghoz (kernel, mysql és postgresql ez az eset):
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
Ha megnézi a mariadb-x86_64.conf fájlt, látni fogja a csomagkönyvtárak abszolút elérési útját.
cat mariadb-x86_64.conf
/usr/lib64/mysql
A fenti módszer véglegesen beállítja a könyvtár elérési útját. Ideiglenes beállításához használja az LD_LIBRARY_PATH környezeti változót a parancssorban. Ha meg szeretné tartani a változtatásokat, akkor adja hozzá ezt a sort a shell inicializálási fájljához: /etc/profile (global) vagy ~/.profile (felhasználóspecifikus).
export LD_LIBRARY_PATH=/path/to/library/file
Megosztott könyvtárak kezelése Linuxban
Most nézzük meg, hogyan kezeljük a megosztott könyvtárakat. A bináris fájlokhoz tartozó megosztott könyvtári függőségek listájának megtekintéséhez használja az ldd segédprogramot. Az ldd kimenete a következő formában van:
library name => filename (some hexadecimal value)
OR
filename (some hexadecimal value) #this is shown when library name can’t be read
Ez a parancs megjeleníti az ls parancs összes megosztott könyvtárának függőségét.
ldd /usr/bin/ls
OR
ldd /bin/ls
Minta kimenet
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)
Mivel a megosztott könyvtárak számos különböző könyvtárban létezhetnek, a program indításakor ezekben a könyvtárakban való keresés nagyon nem hatékony: ez a dinamikus könyvtárak egyik valószínű hátránya. Ezért egy gyorsítótárazási mechanizmust alkalmaznak, amelyet az ldconfig program hajt végre.
Alapértelmezés szerint az ldconfig beolvassa az /etc/ld.so.conf fájl tartalmát, létrehozza a megfelelő szimbolikus hivatkozásokat a dinamikus hivatkozási könyvtárakban, majd gyorsítótárat ír a >/etc/ld.so.cache, amelyet aztán könnyen használhatnak más programok.
Ez különösen fontos, ha éppen most telepített új megosztott könyvtárakat, vagy létrehozta saját, vagy új könyvtári könyvtárakat. A módosítások végrehajtásához futtassa az ldconfig parancsot.
ldconfig
OR
ldconfig -v #shows files and directories it works with
A megosztott könyvtár létrehozása után telepítenie kell azt. Áthelyezheti a fent említett szabványos könyvtárak bármelyikébe, és futtathatja az ldconfig parancsot.
Alternatív megoldásként futtassa a következő parancsot a soname és a fájlnév közötti szimbolikus hivatkozások létrehozásához:
ldconfig -n /path/to/your/shared/libraries
A saját könyvtárak létrehozásának megkezdéséhez tekintse meg ezt a The Linux Documentation Project (TLDP) útmutatót.
Ez minden most! Ebben a cikkben bemutattuk a könyvtárakat, és elmagyaráztuk a megosztott könyvtárakat, valamint azok kezelését Linux alatt. Ha bármilyen kérdése vagy további ötlete van, használja az alábbi megjegyzés űrlapot.