Razumijevanje zajedničkih biblioteka u Linuxu


U programiranju, biblioteka je skup unaprijed kompajliranih dijelova koda koji se mogu ponovno koristiti u programu. Knjižnice pojednostavljuju život programerima, jer pružaju funkcije koje se mogu ponovno koristiti, rutine, klase, strukture podataka i tako dalje (koje je napisao drugi programer), a koje mogu koristiti u svojim programima.

Na primjer, ako gradite aplikaciju koja treba izvoditi matematičke operacije, ne morate stvoriti 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 knjižnice), libcurl (datoteka s više protokola biblioteka za prijenos), libcrypt (biblioteka koja se koristi za enkripciju, raspršivanje i kodiranje u C) i još mnogo toga.

Linux podržava dvije klase biblioteka, naime:

  • Statičke biblioteke – vezane su za program statički tijekom kompilacije.
  • Dinamičke ili dijeljene biblioteke – učitavaju se kada se program pokrene i učita u memoriju, a povezivanje se događa tijekom izvođenja.

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

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

Konvencije imenovanja dijeljene biblioteke

Dijeljene biblioteke imenuju se na dva načina: naziv biblioteke (a.k.a soname) i “naziv datoteke” (apsolutni put do datoteke koja pohranjuje kod biblioteke).

Na primjer, soname za libc je libc.so.6: gdje je lib prefiks, c je opisni naziv, znači zajednički objekt, a 6 je verzija. A naziv datoteke je: /lib64/libc.so.6. Imajte na umu da je ime zapravo simbolička veza na naziv datoteke.

Lociranje zajedničkih biblioteka u Linuxu

Dijeljene biblioteke učitavaju ld.so (ili ld.so.x) i ld-linux.so (ili ld- linux.so.x), 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 njen naziv biblioteke ili naziv datoteke, a staza biblioteke pohranjuje direktorije u kojima se biblioteke mogu pronaći u datotečnom sustavu. Prema zadanim postavkama, biblioteke se nalaze u /usr/local/lib, /usr/local/lib64, /usr/lib i /usr/lib64; biblioteke za pokretanje sustava nalaze se u /lib i /lib64. Programeri mogu, međutim, instalirati biblioteke na prilagođena mjesta.

Put knjižnice može se definirati u /etc/ld.so.conf datoteci koju možete uređivati uređivačem naredbenog retka.

vi /etc/ld.so.conf 

Red(ovi) u ovoj datoteci upućuju kernel da učita datoteku u /etc/ld.so.conf.d. Na ovaj način, održavatelji paketa ili programeri mogu dodati svoje prilagođene knjižnične direktorije na popis za pretraživanje.

Ako pogledate u direktorij /etc/ld.so.conf.d, 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 apsolutni put do biblioteka paketa.

cat mariadb-x86_64.conf

/usr/lib64/mysql

Gornja metoda trajno postavlja stazu knjižnice. Da biste ga privremeno postavili, upotrijebite varijablu okruženja LD_LIBRARY_PATH u naredbenom retku. Ako želite zadržati promjene trajnim, dodajte ovaj redak u inicijalizacijsku datoteku ljuske /etc/profile (globalno) ili ~/.profile (određeno za korisnika).

export LD_LIBRARY_PATH=/path/to/library/file

Upravljanje dijeljenim bibliotekama u Linuxu

Pogledajmo sada kako se nositi s dijeljenim knjižnicama. Da biste dobili popis svih ovisnosti dijeljene biblioteke za binarnu datoteku, možete koristiti uslužni program ldd. 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 zajedničke knjižnice za naredbu ls.

ldd /usr/bin/ls
OR
ldd /bin/ls
Uzorak izlaza
	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 zajedničke knjižnice mogu postojati u mnogo različitih direktorija, pretraživanje kroz sve te direktorije kada se program pokrene bilo bi uvelike neučinkovito: što je jedan od mogućih nedostataka dinamičkih knjižnica. Stoga se koristi mehanizam predmemoriranja koji izvodi program ldconfig.

Prema zadanim postavkama, ldconfig čita sadržaj /etc/ld.so.conf, stvara odgovarajuće simboličke veze u direktorijima dinamičkih veza, a zatim zapisuje predmemoriju u /etc/ld.so.cachekoji zatim lako koriste drugi programi.

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

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

Nakon što stvorite svoju dijeljenu biblioteku, trebate je instalirati. Možete ga premjestiti u bilo koji od gore navedenih standardnih direktorija i pokrenuti naredbu ldconfig.

Alternativno, pokrenite sljedeću naredbu za stvaranje simboličkih veza od soname do naziva datoteke:

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

Da biste započeli sa stvaranjem vlastitih biblioteka, pogledajte ovaj vodič od The Linux Documentation Project (TLDP).

To je sve za sada! U ovom smo vam članku dali uvod u knjižnice i objasnili zajedničke knjižnice te kako njima upravljati u Linuxu. Ako imate bilo kakvih pitanja ili dodatnih ideja za dijeljenje, upotrijebite obrazac za komentare u nastavku.