Razumevanje skupnih knjižnic v Linuxu


Pri programiranju je knjižnica izbor vnaprej sestavljenih kosov, ki jih je mogoče znova uporabiti v programu. Knjižnice poenostavljajo življenje programerjem, saj ponujajo funkcije za večkratno uporabo, rutine, razrede, podatkovne strukture itd. (Ki jih je napisal drug programer), ki jih lahko uporabljajo v svojih programih.

Na primer, če izdelujete aplikacijo, ki mora izvajati matematične operacije, vam za to ni treba ustvariti nove matematične funkcije, lahko preprosto uporabite obstoječe funkcije v knjižnicah za ta programski jezik.

Primeri knjižnic v Linuxu vključujejo libc (standardna knjižnica C) ali glibc (različica GNU standardne knjižnice C), libcurl (knjižnica za prenos datotek z več protokoli), libcrypt (knjižnica, ki se uporablja za šifriranje, zgoščevanje in kodiranje v C) in še veliko več .

Linux podpira dva razreda knjižnic, in sicer:

  • Statične knjižnice - so statično vezane na program v času prevajanja.
  • Dinamične knjižnice ali knjižnice v skupni rabi - naložijo se ob zagonu programa in naložijo v pomnilnik, med izvajanjem pa pride do vezave.

Dinamične knjižnice ali knjižnice v skupni rabi lahko razdelimo na:

  • Dinamično povezane knjižnice - tukaj je program povezan s knjižnico v skupni rabi in jedro ob izvajanju naloži knjižnico (če ni v pomnilniku).
  • Dinamično naložene knjižnice - program prevzame popoln nadzor s klicem funkcij s knjižnico.

Knjižnice v skupni rabi so poimenovane na dva načina: ime knjižnice (znano tudi kot soname) in\"ime datoteke" (absolutna pot do datoteke, ki shrani kodo knjižnice).

Na primer, ime za libc je libc.so.6: kjer je lib predpona, je c opisno ime, torej pomeni predmet v skupni rabi, 6 pa različica. Ime datoteke je: /lib64/libc.so.6. Upoštevajte, da je soname pravzaprav simbolična povezava do imena datoteke.

Knjižnice v skupni rabi nalagata programa ld.so (ali ld.so.x) in ld-linux.so (ali ld-linux.so.x), kjer je x različica. V Linuxu /lib/ld-linux.so.x išče in nalaga vse knjižnice v skupni rabi, ki jih uporablja program.

Program lahko pokliče knjižnico z imenom knjižnice ali imenom datoteke, pot knjižnice pa shrani imenike, kjer so knjižnice v datotečnem sistemu. Privzeto se knjižnice nahajajo v/usr/local/lib,/usr/local/lib64,/usr/lib in/usr/lib64; knjižnice za zagon sistema so v /lib in /lib64. Programerji pa lahko knjižnice namestijo na lokacije po meri.

Pot knjižnice lahko določite v datoteki /etc/ld.so.conf, ki jo lahko uredite z urejevalnikom ukazne vrstice.

# vi /etc/ld.so.conf 

Vrstice v tej datoteki naložijo jedru, naj naloži datoteko v /etc/ld.so.conf.d. Na ta način lahko vzdrževalci paketov ali programerji na seznam za iskanje dodajo svoje imenike knjižnic po meri.

Če pogledate v imenik /etc/ld.so.conf.d, boste videli datoteke .conf za nekatere pogoste pakete (v tem primeru jedro, mysql in postgresql):

# 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

Če pogledate mariadb-x86_64.conf, boste videli absolutno pot do knjižnic paketa.

# cat mariadb-x86_64.conf

/usr/lib64/mysql

Zgornja metoda trajno nastavi pot knjižnice. Če ga želite začasno nastaviti, uporabite spremenljivko okolja LD_LIBRARY_PATH v ukazni vrstici. Če želite spremembe ohraniti trajne, dodajte to vrstico v inicializacijsko datoteko lupine/etc/profile (globalno) ali ~/.profile (za uporabnika).

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

Poglejmo zdaj, kako ravnati s knjižnicami v skupni rabi. Če želite dobiti seznam vseh odvisnosti knjižnice v skupni rabi za binarno datoteko, lahko uporabite pripomoček ldd. Izhod ldd je v obliki:

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

Ta ukaz prikazuje vse odvisnosti knjižnice v skupni rabi za ukaz ls.

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

Ker lahko knjižnice v skupni rabi obstajajo v številnih različnih imenikih, bi bilo iskanje po vseh teh imenikih ob zagonu programa zelo neučinkovito: to je ena od verjetnih pomanjkljivosti dinamičnih knjižnic. Zato je bil uporabljen mehanizem predpomnjenja, ki ga izvaja program ldconfig.

Privzeto ldconfig prebere vsebino /etc/ld.so.conf, ustvari ustrezne simbolne povezave v imenikih dinamičnih povezav in nato zapiše predpomnilnik v /etc/ld.so.cache, ki ga nato zlahka uporabljajo drugi programi .

To je zelo pomembno, še posebej, če ste pravkar namestili nove knjižnice v skupni rabi ali ustvarili lastne ali ustvarili nove imenike knjižnic. Za izvedbo sprememb morate zagnati ukaz ldconfig.

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

Ko ustvarite knjižnico v skupni rabi, jo morate namestiti. Lahko ga premaknete v katerega koli od zgoraj navedenih standardnih imenikov in zaženete ukaz ldconfig.

Druga možnost je, da zaženete naslednji ukaz za ustvarjanje simboličnih povezav od soname do imena datoteke:

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

Če želite začeti z ustvarjanjem lastnih knjižnic, si oglejte ta priročnik iz dokumentacije za Linux (TLDP).

To je vse za zdaj! V tem članku smo vam predstavili knjižnice, razložili knjižnice v skupni rabi in kako jih upravljati v Linuxu. Če imate kakršna koli vprašanja ali dodatne ideje, ki jih želite deliti, uporabite spodnji obrazec za komentar.