Jagatud raamatukogude mõistmine Linuxis
Programmeerimisel on teek valik eelnevalt koostatud koodijuppe, mida saab programmis uuesti kasutada. Raamatukogud lihtsustavad programmeerijate elu, kuna pakuvad korduvkasutatavaid funktsioone, rutiini, klasse, andmestruktuure ja muud sellist (mille on kirjutanud teine programmeerija), mida nad saavad oma programmides kasutada.
Näiteks kui ehitate rakendust, mis peab tegema matemaatilisi toiminguid, ei pea te selle jaoks uut matemaatikafunktsiooni looma, saate selle programmeerimiskeele jaoks lihtsalt kasutada raamatukogudes olemasolevaid funktsioone.
Linuxi teekide näideteks on näiteks libc (standardne C-teek) või glibc (standardse C-teegi GNU-versioon), libcurl (mitme protokolliga failiedastusraamatukogu), libcrypt (krüpteerimiseks, räsimiseks ja C-s kodeerimiseks kasutatav teek) ja palju muud .
Linux toetab kahte klassi teeke, nimelt:
- Staatilised teegid - seotakse programmiga koostamise ajal staatiliselt.
- Dünaamilised või jagatud teegid - laaditakse programmi käivitamisel ja mällu laadimisel ning sidumine toimub käitamise ajal.
Dünaamilisi või jagatud teeke saab liigitada järgmiselt:
- Dünaamiliselt lingitud teegid - siin on programm lingitud jagatud teegiga ja kern laadib teegi (juhul kui seda pole mälus) käivitamisel.
- Dünaamiliselt laaditud teegid - programm võtab täieliku kontrolli, kutsudes teegiga funktsioone.
Jagatud teeke nimetatakse kahel viisil: teegi nimi (teise nimega hüüdnimi) ja\"faili nimi" (absoluutne tee faili, mis salvestab raamatukogu koodi).
Näiteks on libc'i soname libc.so.6: kus lib on eesliide, c on kirjeldav nimi, see tähendab jagatud objekti ja 6 on versioon. Ja selle failinimi on: /lib64/libc.so.6. Pange tähele, et hüüdnimi on tegelikult sümboolne link failinimele.
Jagatud teeke laadivad programmid ld.so (või ld.so.x) ja ld-linux.so (või ld-linux.so.x), kus x on versioon. Linuxis otsib /lib/ld-linux.so.x otsib ja laadib kõik programmi kasutatavad jagatud teegid.
Programm võib helistada raamatukogule, kasutades selle teegi nime või failinime, ja teegi tee talletab katalooge, kus raamatukogusid saab leida failisüsteemist. Vaikimisi asuvad teegid kataloogides/usr/local/lib,/usr/local/lib64,/usr/lib ja/usr/lib64; süsteemi käivitamise teegid on/lib ja/lib64. Programmeerijad saavad siiski installida teeke kohandatud asukohtadesse.
Teegi tee saab määratleda failis /etc/ld.so.conf, mida saate redigeerida käsurea redaktoriga.
# vi /etc/ld.so.conf
Selle faili rida (d) käsib kernelil faili laadida /etc/ld.so.conf.d. Nii saavad pakettide hooldajad või programmeerijad oma kohandatud teegi kataloogid otsinguloendisse lisada.
Kui vaatate kataloogi /etc/ld.so.conf.d, näete .conf-faile mõnede tavaliste pakettide (antud juhul kernel, mysql ja postgresql) jaoks:
# 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
Kui vaatate pilti mariadb-x86_64.conf, näete absoluutset teed paketi teekide juurde.
# cat mariadb-x86_64.conf /usr/lib64/mysql
Eespool toodud meetod määrab raamatukogu tee jäädavalt. Selle ajutiseks määramiseks kasutage käsureal keskkonnamuutujat LD_LIBRARY_PATH. Kui soovite, et muudatused jääksid püsivaks, lisage see rida kesta initsialiseerimisfaili/etc/profile (globaalne) või ~/.profile (kasutajapõhine).
# export LD_LIBRARY_PATH=/path/to/library/file
Vaatame nüüd, kuidas jagatud raamatukogudega hakkama saada. Binaarfaili kõigi jagatud teegisõltuvuste loendi saamiseks võite kasutada utiliiti ldd. Ldd väljund on kujul:
library name => filename (some hexadecimal value) OR filename (some hexadecimal value) #this is shown when library name can’t be read
See käsk näitab kõiki käsuga ls jagatud teegi sõltuvusi.
# 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)
Kuna jagatud teegid võivad eksisteerida paljudes erinevates kataloogides, oleks programmi käivitamisel kõigi nende kataloogide otsimine väga ebaefektiivne: see on dünaamiliste teekide üks tõenäolisi puudusi. Seetõttu kasutatakse vahemällu salvestamise mehhanismi, mida teostab programm ldconfig.
Vaikimisi loeb ldconfig faili /etc/ld.so.conf sisu, loob dünaamiliste linkide kataloogidesse sobivad sümboolsed lingid ja kirjutab seejärel vahemälu kataloogi /etc/ld.so.cache, mida teised programmid seejärel hõlpsalt kasutavad .
See on väga oluline, eriti kui olete just installinud uued jagatud teegid või loonud oma või loonud uued teegi kataloogid. Muudatuste teostamiseks peate käivitama käsu ldconfig.
# ldconfig OR # ldconfig -v #shows files and directories it works with
Pärast jagatud kogu loomist peate selle installima. Võite selle teisaldada mõnda ülalnimetatud standardsesse kataloogi ja käivitada käsu ldconfig.
Teise võimalusena käivitage järgmine käsk, et luua sümboolsetest linkidest failinimeni:
# ldconfig -n /path/to/your/shared/libraries
Oma teekide loomise alustamiseks vaadake seda juhendit Linuxi dokumentatsiooniprojektist (TLDP).
Praeguseks kõik! Selles artiklis tegime teile sissejuhatuse raamatukogudesse, selgitasime jagatud teeke ja nende haldamist Linuxis. Kui teil on jagamiseks küsimusi või täiendavaid ideid, kasutage allolevat kommentaarivormi.