Kuelewa Maktaba Zilizoshirikiwa katika Linux


Katika upangaji programu, maktaba ni urval wa vipande vya msimbo vilivyokusanywa awali ambavyo vinaweza kutumika tena katika programu. Maktaba hurahisisha maisha kwa waandaaji wa programu, kwa kuwa hutoa kazi zinazoweza kutumika tena, taratibu, madarasa, miundo ya data, na kadhalika (iliyoandikwa na programu nyingine), ambayo wanaweza kutumia katika programu zao.

Kwa mfano, ikiwa unaunda programu ambayo inahitaji kufanya shughuli za hesabu, sio lazima uunde kitendakazi kipya cha hesabu kwa hiyo, unaweza kutumia tu vitendaji vilivyopo kwenye maktaba kwa lugha hiyo ya programu.

Mifano ya maktaba katika Linux ni pamoja na libc (maktaba ya kawaida ya C) au Glibc (toleo la GNU la maktaba ya kawaida ya C), libcurl (maktaba ya kuhamisha faili nyingi za protocol), libcrypt (maktaba inayotumika kwa usimbaji fiche, hashing, na usimbaji katika C), na nyingi. zaidi.

Linux inasaidia madarasa mawili ya maktaba, ambayo ni:

  • Maktaba tuli - zimefungwa kwa mpango tuli kwa wakati wa kukusanya.
  • Maktaba zenye nguvu au zinazoshirikiwa - hupakiwa wakati programu inapozinduliwa na kupakiwa kwenye kumbukumbu na kufungwa hutokea wakati wa utekelezaji.

Maktaba zenye nguvu au zinazoshirikiwa zinaweza kuainishwa katika:

  • Maktaba zilizounganishwa kwa nguvu - hapa programu imeunganishwa na maktaba iliyoshirikiwa na punje hupakia maktaba (ikiwa haipo kwenye kumbukumbu) inapotekelezwa.
  • Maktaba zilizopakiwa kwa nguvu - programu inachukua udhibiti kamili kwa kupiga vitendaji na maktaba.

Maktaba zinazoshirikiwa zimepewa majina kwa njia mbili: jina la maktaba (a.k.a soname) na \jina la faili (njia kamili ya faili ambayo huhifadhi msimbo wa maktaba).

Kwa mfano, soname ya libc ni libc.so.6: ambapo lib ni kiambishi awali, c ni jina la maelezo, hivyo inamaanisha kitu kilichoshirikiwa, na 6 ni toleo. Na jina lake la faili ni: /lib64/libc.so.6. Kumbuka kuwa soname ni kiunga cha ishara kwa jina la faili.

Maktaba zinazoshirikiwa hupakiwa na programu za ld.so (au ld.so.x) na ld-linux.so (au ld-linux.so.x), ambapo x ni toleo. Katika Linux, /lib/ld-linux.so.x hutafuta na kupakia maktaba zote zinazoshirikiwa zinazotumiwa na programu.

Programu inaweza kuita maktaba kwa kutumia jina la maktaba yake au jina la faili, na njia ya maktaba huhifadhi saraka ambapo maktaba zinaweza kupatikana kwenye mfumo wa faili. Kwa chaguo-msingi, maktaba ziko katika /usr/local/lib, /usr/local/lib64, /usr/lib na /usr/lib64; maktaba za uanzishaji wa mfumo ziko ndani /lib na /lib64. Watengenezaji programu wanaweza, hata hivyo, kusakinisha maktaba katika maeneo maalum.

Njia ya maktaba inaweza kufafanuliwa katika /etc/ld.so.conf faili ambayo unaweza kuhariri na kihariri cha mstari wa amri.

# vi /etc/ld.so.conf 

Laini/mistari katika faili hii inaelekeza kernel kupakia faili katika /etc/ld.so.conf.d. Kwa njia hii, watunza vifurushi au waandaaji programu wanaweza kuongeza saraka zao maalum za maktaba kwenye orodha ya utaftaji.

Ukiangalia katika saraka ya /etc/ld.so.conf.d, utaona faili za .conf za vifurushi vya kawaida (kernel, mysql, na postgresql katika kesi hii):

# 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

Ukiangalia mariadb-x86_64.conf, utaona njia kamili ya kufunga maktaba.

# cat mariadb-x86_64.conf

/usr/lib64/mysql

Njia iliyo hapo juu inaweka njia ya maktaba kabisa. Ili kuiweka kwa muda, tumia mabadiliko ya mazingira ya LD_LIBRARY_PATH kwenye mstari wa amri. Ikiwa ungependa kuweka mabadiliko kuwa ya kudumu, kisha ongeza laini hii kwenye faili ya uanzishaji ya ganda /etc/profile (kimataifa) au ~/.profile (mahususi ya mtumiaji).

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

Hebu sasa tuangalie jinsi ya kushughulika na maktaba zinazoshirikiwa. Ili kupata orodha ya vitegemezi vyote vya maktaba vilivyoshirikiwa kwa faili ya binary, unaweza kutumia matumizi ya ldd. Pato la ldd liko katika fomu:

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

Amri hii inaonyesha tegemezi zote za maktaba zilizoshirikiwa kwa amri ya 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)

Kwa sababu maktaba zinazoshirikiwa zinaweza kuwepo katika saraka nyingi tofauti, kutafuta katika saraka zote hizi wakati programu inapozinduliwa hakutakuwa na ufanisi mkubwa: ambayo ni mojawapo ya hasara zinazowezekana za maktaba zinazobadilika. Kwa hiyo utaratibu wa caching hutumiwa, unaofanywa na programu ya ldconfig.

Kwa chaguo-msingi, ldconfig inasoma maudhui ya /etc/ld.so.conf, huunda viungo vya ishara vinavyofaa katika saraka za viungo vinavyobadilika, na kisha kuandika kache kwa /etc/ld.so.cache ambayo hutumiwa kwa urahisi na programu zingine. .

Hii ni muhimu sana hasa wakati umesakinisha maktaba mpya zilizoshirikiwa au kuunda yako mwenyewe, au kuunda saraka mpya za maktaba. Unahitaji kuendesha amri ya ldconfig ili kufanya mabadiliko.

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

Baada ya kuunda maktaba yako iliyoshirikiwa, unahitaji kuisakinisha. Unaweza kuihamisha kwenye saraka zozote za kawaida zilizotajwa hapo juu na kuendesha ldconfig amri.

Vinginevyo, endesha amri ifuatayo ili kuunda viungo vya mfano kutoka kwa soname hadi kwa jina la faili:

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

Ili kuanza kuunda maktaba zako mwenyewe, angalia mwongozo huu kutoka kwa Mradi wa Hati za Linux(TLDP).

Ni hayo tu kwa sasa! Katika makala haya, tulikupa utangulizi wa maktaba na tukaelezea maktaba zinazoshirikiwa, na jinsi ya kuzidhibiti katika Linux. Ikiwa una maswali yoyote au maoni ya ziada ya kushiriki, tumia fomu ya maoni hapa chini.