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.