Izpratne par koplietojamām bibliotēkām Linux


Programmēšanā bibliotēka ir iepriekš sastādītu koda gabalu sortiments, kurus var atkārtoti izmantot programmā. Bibliotēkas atvieglo programmētāju dzīvi, jo tās nodrošina atkārtoti lietojamas funkcijas, kārtību, klases, datu struktūras un tā tālāk (ko uzrakstījis cits programmētājs), ko viņi var izmantot savās programmās.

Piemēram, ja veidojat lietojumprogrammu, kurai jāveic matemātikas operācijas, jums nav jāizveido jauna matemātikas funkcija, varat vienkārši izmantot esošās funkcijas bibliotēkās šai programmēšanas valodai.

Linux bibliotēku piemēri ir libc (standarta C bibliotēka) vai glibc (standarta C bibliotēkas GNU versija), libcurl (daudzprotokolu failu pārsūtīšanas bibliotēka), libcrypt (bibliotēka, ko izmanto šifrēšanai, jaukšanai un kodēšanai C) un daudzi citi .

Linux atbalsta divas bibliotēku klases, proti:

  • Statiskās bibliotēkas - sastādīšanas laikā ir statiski saistītas ar programmu.
  • Dinamiskās vai koplietojamās bibliotēkas - tiek ielādētas, palaižot programmu un ielādējot atmiņā, un saistīšana notiek izpildes laikā.

Dinamiskās vai koplietotās bibliotēkas var turpmāk iedalīt kategorijās:

  • Dinamiski saistītas bibliotēkas - šeit programma ir saistīta ar koplietojamo bibliotēku, un kodols pēc izpildes ielādē bibliotēku (ja tā nav atmiņā).
  • Dinamiski ielādētas bibliotēkas - programma pilnībā kontrolē, izsaucot funkcijas ar bibliotēku.

Koplietojamās bibliotēkas tiek sauktas divos veidos: bibliotēkas nosaukums (arī dēvēts) un “faila nosaukums” (absolūts ceļš uz failu, kurā glabājas bibliotēkas kods).

Piemēram, libc soname ir libc.so.6: kur lib ir prefikss, c ir aprakstošs nosaukums, tas nozīmē koplietojamu objektu, un 6 ir versija. Un tā faila nosaukums ir: /lib64/libc.so.6. Ņemiet vērā, ka Soname faktiski ir simboliska saite uz faila nosaukumu.

Koplietotās bibliotēkas ielādē ld.so (vai ld.so.x) un ld-linux.so (vai ld-linux.so.x) programmas, kur x ir versija. Operētājsistēmā Linux /lib/ld-linux.so.x meklē un ielādē visas programmas izmantotās koplietojamās bibliotēkas.

Programma var izsaukt bibliotēku, izmantojot tās bibliotēkas nosaukumu vai faila nosaukumu, un bibliotēkas ceļš glabā direktorijus, kuros bibliotēkas var atrast failu sistēmā. Pēc noklusējuma bibliotēkas atrodas mapēs/usr/local/lib,/usr/local/lib64,/usr/lib un/usr/lib64; sistēmas startēšanas bibliotēkas atrodas mapēs/lib un/lib64. Programmētāji tomēr var instalēt bibliotēkas pielāgotās vietās.

Bibliotēkas ceļu var definēt failā /etc/ld.so.conf, kuru var rediģēt ar komandrindas redaktoru.

# vi /etc/ld.so.conf 

Šī faila rinda (-s) dod kodolam norādījumu ielādēt failu mapē /etc/ld.so.conf.d. Tādā veidā pakotņu uzturētāji vai programmētāji var pievienot savus pielāgotos bibliotēku direktorijus meklēšanas sarakstam.

Ieskatoties direktorijā /etc/ld.so.conf.d, dažu parasto pakotņu (šajā gadījumā kodola, mysql un postgresql) faili būs redzami .conf.

# 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

Apskatot mariadb-x86_64.conf, jūs redzēsiet absolūtu ceļu uz pakotnes bibliotēkām.

# cat mariadb-x86_64.conf

/usr/lib64/mysql

Iepriekš minētā metode bibliotēkas ceļu nosaka pastāvīgi. Lai to īslaicīgi iestatītu, komandrindā izmantojiet vides mainīgo LD_LIBRARY_PATH. Ja vēlaties saglabāt izmaiņas pastāvīgas, pievienojiet šo rindu čaulas inicializācijas failā/etc/profile (globāls) vai ~/.profile (specifisks lietotājam).

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

Tagad apskatīsim, kā rīkoties ar koplietojamām bibliotēkām. Lai iegūtu visu binārā faila koplietojamo bibliotēkas atkarību sarakstu, varat izmantot utilītu ldd. Ldd izeja ir šāda:

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

Šī komanda parāda visas koplietojamās bibliotēkas atkarības no komandas 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)

Tā kā koplietojamas bibliotēkas var pastāvēt daudzos dažādos direktorijos, tad, palaižot programmu, visu šo direktoriju meklēšana būtu ļoti neefektīva: tas ir viens no iespējamiem dinamisko bibliotēku trūkumiem. Tāpēc tiek izmantots kešatmiņas mehānisms, ko veic programma ldconfig.

Pēc noklusējuma ldconfig nolasa /etc/ld.so.conf saturu, izveido atbilstošās simboliskās saites dinamisko saišu direktorijos un pēc tam raksta kešatmiņu mapē /etc/ld.so.cache, kuru pēc tam viegli izmanto citas programmas. .

Tas ir ļoti svarīgi, it īpaši, ja esat tikko instalējis jaunas koplietojamas bibliotēkas vai izveidojis pats savu vai izveidojis jaunus bibliotēku direktorijus. Lai veiktu izmaiņas, palaidiet komandu ldconfig.

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

Pēc koplietojamās bibliotēkas izveides tā jāinstalē. Varat to pārvietot uz jebkuru no iepriekš minētajiem standarta direktorijiem un palaist komandu ldconfig.

Varat arī palaist šo komandu, lai izveidotu simboliskas saites no soname uz faila nosaukumu:

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

Lai sāktu veidot savas bibliotēkas, skatiet šo rokasgrāmatu no Linux dokumentācijas projekta (TLDP).

Tas pagaidām ir viss! Šajā rakstā mēs sniedzām jums ievadu bibliotēkās, izskaidrojām koplietojamās bibliotēkas un to pārvaldību Linux. Ja jums ir kādi jautājumi vai papildu idejas, ko kopīgot, izmantojiet zemāk esošo komentāru veidlapu.