Linux-da paýlaşylan kitaphanalara düşünmek


Programmirlemekde kitaphana, bir programmada gaýtadan ulanyp boljak öňünden düzülen kod bölekleriniň görnüşidir. Kitaphanalar programmistler üçin durmuşy aňsatlaşdyrýar, sebäbi olar öz programmalarynda ulanyp boljak gaýtadan ulanylýan funksiýalary, tertipleri, synplary, maglumat gurluşlaryny we ş.m. (başga bir programmist tarapyndan ýazylan) üpjün edýär.

Mysal üçin, matematika amallaryny ýerine ýetirmeli bir programma gurýan bolsaňyz, täze matematika funksiýasyny döretmeli dälsiňiz, kitaphanalarda bar bolan funksiýalary şol programma dili üçin ulanyp bilersiňiz.

Linux-daky kitaphanalara mysal hökmünde libc (standart C kitaphanasy) ýa-da Glibc (adaty C kitaphanasynyň GNU wersiýasy), libcurl (multiprotokol faýl geçiriş kitaphanasy), libcrypt (C-de şifrlemek, ýuwmak we kodlamak üçin ulanylýan kitaphana) we köpler bar. has köp.

Linux kitaphanalaryň iki synpyny goldaýar:

  • Statik kitaphanalar - düzülen wagtynda statiki bir programma baglydyr.
  • Dinamiki ýa-da umumy kitaphanalar - bir programma işe girizilende ýüklenýär we ýatda saklanýar we iş wagty ýerine ýetirilýär.

Dinamiki ýa-da umumy kitaphanalary mundan başga-da bölüp bolar:

  • Dinamiki taýdan baglanyşdyrylan kitaphanalar - bu ýerde bir programma umumy kitaphana bilen baglanyşdyrylýar we ýadro ýerine ýetirilenden soň ýadro kitaphanany ýükleýär.
  • Dinamiki ýüklenen kitaphanalar - programma kitaphana bilen funksiýalary çagyryp doly gözegçilik edýär.

Paýlaşylan kitaphanalar iki görnüşde atlandyrylýar: kitaphananyň ady (a.k.a soname) we\faýl ady (kitaphananyň koduny saklaýan faýlyň mutlak ýoly).

Mysal üçin, libc-iň son ady libc.so.6: bu ýerde lib prefiksi, c suratlandyryjy at, şonuň üçin umumy obýekt diýmek, 6 wersiýa. Faýlyň ady: /lib64/libc.so.6. Sonamyň aslynda faýlyň adyna simwoliki baglanyşykdygyna üns beriň.

Paýlaşylan kitaphanalar ld.so (ýa-da ld.so.x) we ld-linux.so (ýa-da ld-linux.so.x) programmalary bilen ýüklenýär, bu ýerde x wersiýasy. Linux-da /lib/ld-linux.so.x bir programma tarapyndan ulanylýan ähli umumy kitaphanalary gözleýär we ýükleýär.

Programma, kitaphananyň adyny ýa-da faýl adyny ulanyp, kitaphana çagyryp biler we kitaphananyň ýoly kitaphanalary faýl ulgamynda tapyp boljak kataloglary saklaýar. Düzgüne görä, kitaphanalar/usr/local/lib,/usr/local/lib64,/usr/lib we/usr/lib64; ulgam başlangyç kitaphanalary/lib we/lib64-de. Şeýle-de bolsa, programmistler kitaphanalary ýörite ýerlerde gurup bilerler.

Kitaphana ýoluny buýruk setiri redaktory bilen redaktirläp boljak /etc/ld.so.conf faýlynda kesgitläp bolýar.

# vi /etc/ld.so.conf 

Bu faýldaky setirler ýadro /etc/ld.so.conf.d-de faýl ýüklemegi görkezýär. Şeýlelik bilen, bukjany saklaýjylar ýa-da programmistler gözleg sanawyna ýörite kitaphana kataloglaryny goşup bilerler.

/Etc/ld.so.conf.d bukjasyna göz aýlasaňyz, käbir umumy paketler üçin .conf faýllaryny görersiňiz (bu ýagdaýda ýadro, mysql we 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

Mariadb-x86_64.conf-a göz aýlasaň, bukja kitaphanalaryna doly ýol görersiň.

# cat mariadb-x86_64.conf

/usr/lib64/mysql

Aboveokardaky usul kitaphananyň ýoluny hemişelik kesgitleýär. Wagtlaýyn bellemek üçin buýruk setirindäki LD_LIBRARY_PATH gurşaw üýtgeýjisini ulanyň. Üýtgeşmeleri hemişelik saklamak isleseňiz, bu setiri gabygyň başlangyç faýlyna/etc/profile (global) ýa-da ~/.profile (ulanyjylara mahsus) goşuň.

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

Indi umumy kitaphanalar bilen nähili işleşmelidigine seredeliň. Ikitaraplaýyn faýl üçin ähli umumy kitaphana baglylyklarynyň sanawyny almak üçin ldd kömekçi programmasyny ulanyp bilersiňiz. Ldd-iň çykyşy görnüşde:

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

Bu buýruk ls buýrugy üçin umumy kitaphana baglylyklaryny görkezýär.

# 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)

Paýlaşylan kitaphanalar köp dürli kataloglarda bolup bilýändigi sebäpli, programma açylanda bu kataloglaryň hemmesini gözlemek gaty netijesiz bolar: dinamiki kitaphanalaryň ähtimal kemçiliklerinden biri. Şonuň üçin ldconfig programmasy tarapyndan ýerine ýetirilýän keş keşdesi ulanylýar.

Düzgüne görä, ldconfig /etc/ld.so.conf mazmunyny okaýar, dinamiki baglanyşyk kataloglarynda degişli simwoliki baglanyşyklary döredýär we soňra beýleki programmalar tarapyndan aňsat ulanylýan /etc/ld.so.cache keşini ýazýar. .

Esasanam täze paýlaşylan kitaphanalary guranyňyzda ýa-da özüňiz döredeniňizde ýa-da täze kitaphana kataloglaryny döredeniňizde bu örän möhümdir. Üýtgeşmeleri amala aşyrmak üçin ldconfig buýrugyny işletmeli.

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

Umumy kitaphanany döredeniňizden soň, ony gurmaly. Eithera-da ýokarda agzalan adaty kataloglaryň islendik birine geçirip, ldconfig buýrugyny işledip bilersiňiz.

Ativea-da bolmasa, soname-den faýl adyna simwoliki baglanyşyk döretmek üçin aşakdaky buýrugy işlediň:

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

Öz kitaphanalaryňyzy döretmek bilen başlamak üçin Linux Resminamalar Taslamasyndan (TLDP) şu gollanmany gözden geçiriň.

Bularyň hemmesi häzirlikçe! Bu makalada size kitaphanalar bilen tanyşdyrdyk we umumy kitaphanalary we Linux-da nädip dolandyrmalydygyny düşündirdik. Paýlaşmak üçin soraglaryňyz ýa-da goşmaça pikirleriňiz bar bolsa, aşakdaky düşündiriş formuny ulanyň.