Înțelegerea bibliotecilor partajate în Linux


În programare, o bibliotecă este un sortiment de bucăți de cod pre-compilate care pot fi reutilizate într-un program. Bibliotecile simplifică viața programatorilor, prin faptul că oferă funcții reutilizabile, rutine, clase, structuri de date și așa mai departe (scrise de un alt programator), pe care le pot folosi în programele lor.

De exemplu, dacă construiți o aplicație care trebuie să efectueze operații matematice, nu trebuie să creați o nouă funcție matematică pentru asta, puteți pur și simplu să utilizați funcțiile existente în biblioteci pentru acel limbaj de programare.

Exemple de biblioteci în Linux includ libc (biblioteca standard C) sau Glibc (versiunea GNU a bibliotecii standard C), libcurl (fișier multiprotocol). transfer library), libcrypt (biblioteca utilizată pentru criptare, hashing și codificare în C) și multe altele.

Linux acceptă două clase de biblioteci, și anume:

  • Biblioteci statice – sunt legate la un program în mod static în timpul compilării.
  • Biblioteci dinamice sau partajate – sunt încărcate atunci când un program este lansat și încărcat în memorie, iar legarea are loc în timpul rulării.

Bibliotecile dinamice sau partajate pot fi clasificate în continuare în:

  • Biblioteci legate dinamic – aici un program este legat de biblioteca partajată, iar nucleul încarcă biblioteca (în cazul în care nu este în memorie) la execuție.
  • Biblioteci încărcate dinamic – programul preia controlul deplin apelând funcții cu biblioteca.

Convenții de denumire a bibliotecii partajate

Bibliotecile partajate sunt denumite în două moduri: numele bibliotecii (alias sonam) și „nume fișier” (calea absolută către fișier care stochează codul bibliotecii).

De exemplu, sonume pentru libc este libc.so.6: unde lib este prefixul, c este un nume descriptiv, deci înseamnă obiect partajat, iar 6 este versiunea. Și numele său de fișier este: /lib64/libc.so.6. Rețineți că soname-ul este de fapt o legătură simbolică către numele fișierului.

Localizarea bibliotecilor partajate în Linux

Bibliotecile partajate sunt încărcate de ld.so (sau ld.so.x) și ld-linux.so (sau ld- linux.so.x), unde x este versiunea. În Linux, /lib/ld-linux.so.x caută și încarcă toate bibliotecile partajate utilizate de un program.

Un program poate apela o bibliotecă folosind numele bibliotecii sau numele său de fișier, iar calea bibliotecii stochează directoare în care bibliotecile pot fi găsite în sistemul de fișiere. În mod implicit, bibliotecile sunt localizate în /usr/local/lib, /usr/local/lib64, /usr/lib și /usr/lib64; Bibliotecile de pornire a sistemului sunt în /lib și /lib64. Cu toate acestea, programatorii pot instala biblioteci în locații personalizate.

Calea bibliotecii poate fi definită în fișierul /etc/ld.so.conf pe care îl puteți edita cu un editor de linie de comandă.

# vi /etc/ld.so.conf 

Rândurile din acest fișier indică nucleului să încarce fișierul în /etc/ld.so.conf.d. În acest fel, întreținătorii de pachete sau programatorii își pot adăuga directoarele bibliotecii personalizate la lista de căutare.

Dacă vă uitați în directorul /etc/ld.so.conf.d, veți vedea fișiere .conf pentru unele pachete comune (kernel, mysql și postgresql în acest caz):

# 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

Dacă aruncați o privire la mariadb-x86_64.conf, veți vedea o cale absolută către bibliotecile de pachete.

# cat mariadb-x86_64.conf

/usr/lib64/mysql

Metoda de mai sus setează permanent calea bibliotecii. Pentru a o seta temporar, utilizați variabila de mediu LD_LIBRARY_PATH de pe linia de comandă. Dacă doriți să păstrați modificările permanente, adăugați această linie în fișierul de inițializare shell /etc/profile (global) sau ~/.profile (specific utilizatorului).

# export LD_LIBRARY_PATH=/path/to/library/file

Gestionarea bibliotecilor partajate în Linux

Să ne uităm acum la cum să ne ocupăm de bibliotecile partajate. Pentru a obține o listă cu toate dependențele bibliotecii partajate pentru un fișier binar, puteți utiliza utilitatea ldd. Rezultatul ldd este sub forma:

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

Această comandă arată toate dependențele bibliotecii partajate pentru comanda ls.

# ldd /usr/bin/ls
OR
# ldd /bin/ls
Ieșire eșantion
	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)

Deoarece bibliotecile partajate pot exista în multe directoare diferite, căutarea prin toate aceste directoare atunci când este lansat un program ar fi foarte ineficientă: ceea ce este unul dintre dezavantajele probabile ale bibliotecilor dinamice. Prin urmare, este folosit un mecanism de stocare în cache, realizat de programul ldconfig.

În mod implicit, ldconfig citește conținutul /etc/ld.so.conf, creează legăturile simbolice adecvate în directoarele de link-uri dinamice și apoi scrie un cache în >/etc/ld.so.cache care este apoi ușor utilizat de alte programe.

Acest lucru este foarte important mai ales când tocmai ați instalat noi biblioteci partajate sau ați creat propriile dvs. sau ați creat directoare de biblioteci noi. Trebuie să rulați comanda ldconfig pentru a efectua modificările.

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

După crearea bibliotecii partajate, trebuie să o instalați. Puteți fie să-l mutați în oricare dintre directoarele standard menționate mai sus și să rulați comanda ldconfig.

Alternativ, rulați următoarea comandă pentru a crea legături simbolice de la soname la numele fișierului:

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

Pentru a începe să vă creați propriile biblioteci, consultați acest ghid din The Linux Documentation Project (TLDP).

Asta este tot pentru acum! În acest articol, v-am oferit o introducere în biblioteci și am explicat bibliotecile partajate și cum să le gestionați în Linux. Dacă aveți întrebări sau idei suplimentare de împărtășit, utilizați formularul de comentarii de mai jos.