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.