Weboldal keresés

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.