Razumijevanje dijeljenih biblioteka u Linuxu


U programiranju, biblioteka je asortiman unapred kompajliranih delova koda koji se mogu ponovo koristiti u programu. Biblioteke pojednostavljuju život programerima tako što pružaju funkcije, rutine, klase, strukture podataka i tako dalje (koje je napisao drugi programer), koje mogu koristiti u svojim programima.

Na primjer, ako gradite aplikaciju koja treba da izvodi matematičke operacije, ne morate kreirati novu matematičku funkciju za to, možete jednostavno koristiti postojeće funkcije u bibliotekama za taj programski jezik.

Primjeri biblioteka u Linuxu uključuju libc (standardna C biblioteka) ili Glibc (GNU verzija standardne C biblioteke), libcurl (višeprotokolska datoteka transfer biblioteku), libcrypt (biblioteka koja se koristi za šifriranje, heširanje i kodiranje u C) i još mnogo toga.

Linux podržava dvije klase biblioteka, i to:

  • Statičke biblioteke – vezane su za program statički u vrijeme kompajliranja.
  • Dinamičke ili dijeljene biblioteke – učitavaju se kada se program pokrene i učita u memoriju, a povezivanje se događa u vrijeme izvršavanja.

Dinamičke ili dijeljene biblioteke mogu se dalje kategorizirati u:

  • Dinamički povezane biblioteke – ovdje je program povezan sa dijeljenom bibliotekom i kernel učitava biblioteku (u slučaju da nije u memoriji) nakon izvršenja.
  • Dinamički učitane biblioteke – program preuzima potpunu kontrolu pozivanjem funkcija s bibliotekom.

Konvencije imenovanja zajedničke biblioteke

Dijeljene biblioteke se imenuju na dva načina: ime biblioteke (a.k.a sonname) i “ime datoteke” (apsolutna putanja do datoteke koja pohranjuje kod biblioteke).

Na primjer, sonname za libc je libc.so.6: gdje je lib prefiks, c je opisno ime, znači zajednički objekt, a 6 je verzija. I njegovo ime datoteke je: /lib64/libc.so.6. Imajte na umu da je soname zapravo simbolička veza do naziva datoteke.

Lociranje dijeljenih biblioteka u Linuxu

Dijeljene biblioteke učitavaju ld.so (ili ld.so.x) i ld-linux.so (ili ld- linux.so.x) programe, gdje je x verzija. U Linuxu, /lib/ld-linux.so.x pretražuje i učitava sve dijeljene biblioteke koje koristi program.

Program može pozvati biblioteku koristeći njeno ime biblioteke ili ime datoteke, a putanja biblioteke pohranjuje direktorije u kojima se biblioteke mogu naći u sistemu datoteka. Biblioteke se prema zadanim postavkama nalaze u /usr/local/lib, /usr/local/lib64, /usr/lib i /usr/lib64; Biblioteke za pokretanje sistema su u /lib i /lib64. Međutim, programeri mogu instalirati biblioteke na prilagođene lokacije.

Putanje biblioteke može se definirati u datoteci /etc/ld.so.conf koju možete uređivati u uređivaču komandne linije.

vi /etc/ld.so.conf 

Linije u ovoj datoteci upućuju kernelu da učita datoteku u /etc/ld.so.conf.d. Na ovaj način, održavatelji paketa ili programeri mogu dodati svoje prilagođene direktorije biblioteka na listu pretraživanja.

Ako pogledate u /etc/ld.so.conf.d direktorij, vidjet ćete .conf datoteke za neke uobičajene pakete (kernel, mysql i postgresql u ovaj slučaj):

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

Ako pogledate mariadb-x86_64.conf, vidjet ćete apsolutnu putanju do biblioteka paketa.

cat mariadb-x86_64.conf

/usr/lib64/mysql

Gornja metoda trajno postavlja putanju biblioteke. Da biste ga privremeno postavili, koristite varijablu okruženja LD_LIBRARY_PATH na komandnoj liniji. Ako želite da promjene ostanu trajne, dodajte ovaj red u datoteku inicijalizacije ljuske /etc/profile (globalno) ili ~/.profile (specifično za korisnika).

export LD_LIBRARY_PATH=/path/to/library/file

Upravljanje zajedničkim bibliotekama u Linuxu

Pogledajmo sada kako postupati sa zajedničkim bibliotekama. Da biste dobili listu svih ovisnosti dijeljene biblioteke za binarni fajl, možete koristiti ldd uslužni program. Izlaz ldd je u obliku:

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

Ova naredba prikazuje sve ovisnosti dijeljene biblioteke za naredbu ls.

ldd /usr/bin/ls
OR
ldd /bin/ls
Sample Output
	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)

Budući da dijeljene biblioteke mogu postojati u mnogo različitih direktorija, pretraživanje svih ovih direktorija kada se program pokrene bilo bi veoma neefikasno: što je jedan od vjerovatnih nedostataka dinamičkih biblioteka. Stoga se koristi mehanizam keširanja, koji izvodi program ldconfig.

Podrazumevano, ldconfig čita sadržaj /etc/ld.so.conf, kreira odgovarajuće simboličke veze u direktorijumima dinamičkih veza, a zatim upisuje keš memoriju u /etc/ld.so.cache koji onda lako koriste drugi programi.

Ovo je vrlo važno posebno kada ste upravo instalirali nove dijeljene biblioteke ili kreirali vlastite, ili kreirali nove direktorije biblioteka. Morate pokrenuti naredbu ldconfig da izvršite promjene.

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

Nakon kreiranja dijeljene biblioteke, morate je instalirati. Možete ga premjestiti u bilo koji od gore navedenih standardnih direktorija i pokrenuti naredbu ldconfig.

Alternativno, pokrenite sljedeću naredbu da kreirate simboličke veze od sonname do naziva datoteke:

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

Da biste započeli s kreiranjem vlastitih biblioteka, pogledajte ovaj vodič iz The Linux Documentation Project (TLDP).

To je sve za sada! U ovom članku smo vam dali uvod u biblioteke i objasnili dijeljene biblioteke i kako njima upravljati u Linuxu. Ako imate pitanja ili dodatne ideje koje možete podijeliti, koristite obrazac za komentare ispod.