ലിനക്സിലെ പങ്കിട്ട ലൈബ്രറികൾ മനസ്സിലാക്കുന്നു


പ്രോഗ്രാമിംഗിൽ, ഒരു പ്രോഗ്രാമിൽ പുനരുപയോഗിക്കാവുന്ന കോഡിന്റെ പ്രീ-കംപൈൽ ചെയ്ത ഭാഗങ്ങളുടെ ഒരു ശേഖരമാണ് ലൈബ്രറി. ലൈബ്രറികൾ പ്രോഗ്രാമർമാരുടെ ജീവിതം ലളിതമാക്കുന്നു, അതിലൂടെ അവർ പുനരുപയോഗിക്കാവുന്ന പ്രവർത്തനങ്ങൾ, ദിനചര്യകൾ, ക്ലാസുകൾ, ഡാറ്റാ ഘടനകൾ എന്നിവയും മറ്റും (മറ്റൊരു പ്രോഗ്രാമർ എഴുതിയത്) നൽകുന്നു, അത് അവർക്ക് അവരുടെ പ്രോഗ്രാമുകളിൽ ഉപയോഗിക്കാൻ കഴിയും.

ഉദാഹരണത്തിന്, നിങ്ങൾ ഗണിത പ്രവർത്തനങ്ങൾ നടത്തേണ്ട ഒരു ആപ്ലിക്കേഷൻ നിർമ്മിക്കുകയാണെങ്കിൽ, അതിനായി ഒരു പുതിയ ഗണിത ഫംഗ്ഷൻ സൃഷ്ടിക്കേണ്ടതില്ല, ആ പ്രോഗ്രാമിംഗ് ഭാഷയ്ക്കായി ലൈബ്രറികളിൽ നിലവിലുള്ള ഫംഗ്ഷനുകൾ നിങ്ങൾക്ക് ഉപയോഗിക്കാം.

ലിനക്സിലെ ലൈബ്രറികളുടെ ഉദാഹരണങ്ങളിൽ libc (സ്റ്റാൻഡേർഡ് C ലൈബ്രറി) അല്ലെങ്കിൽ Glibc (സ്റ്റാൻഡേർഡ് C ലൈബ്രറിയുടെ GNU പതിപ്പ്), libcurl (മൾട്ടിപ്രോട്ടോകോൾ ഫയൽ ട്രാൻസ്ഫർ ലൈബ്രറി), libcrypt (C-യിൽ എൻക്രിപ്ഷൻ, ഹാഷിംഗ്, എൻകോഡിംഗ് എന്നിവയ്ക്കായി ഉപയോഗിക്കുന്ന ലൈബ്രറി) എന്നിവ ഉൾപ്പെടുന്നു. കൂടുതൽ.

Linux രണ്ട് തരം ലൈബ്രറികളെ പിന്തുണയ്ക്കുന്നു, അതായത്:

  • സ്റ്റാറ്റിക് ലൈബ്രറികൾ - കംപൈൽ സമയത്ത് സ്റ്റാറ്റിക് ആയി ഒരു പ്രോഗ്രാമുമായി ബന്ധിപ്പിച്ചിരിക്കുന്നു.
  • ഡൈനാമിക് അല്ലെങ്കിൽ പങ്കിട്ട ലൈബ്രറികൾ - ഒരു പ്രോഗ്രാം സമാരംഭിച്ച് മെമ്മറിയിലേക്ക് ലോഡുചെയ്യുമ്പോൾ ലോഡ് ചെയ്യപ്പെടുകയും റൺ ടൈമിൽ ബൈൻഡിംഗ് സംഭവിക്കുകയും ചെയ്യുന്നു.

ഡൈനാമിക് അല്ലെങ്കിൽ പങ്കിട്ട ലൈബ്രറികളെ ഇനിപ്പറയുന്നതായി തരം തിരിക്കാം:

  • ഡൈനാമിക്കായി ലിങ്ക് ചെയ്uത ലൈബ്രറികൾ - ഇവിടെ ഒരു പ്രോഗ്രാം പങ്കിട്ട ലൈബ്രറിയുമായി ലിങ്ക് ചെയ്uതിരിക്കുന്നു, കൂടാതെ എക്uസിക്യൂഷൻ ചെയ്യുമ്പോൾ കേർണൽ ലൈബ്രറി (മെമ്മറിയിൽ ഇല്ലെങ്കിൽ) ലോഡ് ചെയ്യുന്നു.
  • ഡൈനാമിക്കായി ലോഡുചെയ്ത ലൈബ്രറികൾ - ലൈബ്രറിയുമായുള്ള ഫംഗ്uഷനുകൾ വിളിച്ച് പ്രോഗ്രാം പൂർണ്ണ നിയന്ത്രണം ഏറ്റെടുക്കുന്നു.

പങ്കിട്ട ലൈബ്രറികൾക്ക് രണ്ട് വിധത്തിലാണ് പേര് നൽകിയിരിക്കുന്നത്: ലൈബ്രറിയുടെ പേര് (a.k.a soname), \ഫയലിന്റെ പേര് (ലൈബ്രറി കോഡ് സംഭരിക്കുന്ന ഫയലിലേക്കുള്ള സമ്പൂർണ്ണ പാത).

ഉദാഹരണത്തിന്, libc-യുടെ സോനേം libc.so.6 ആണ്: ഇവിടെ lib എന്നത് പ്രിഫിക്uസ് ആണ്, c എന്നത് ഒരു വിവരണാത്മക നാമമാണ്, അതിനാൽ പങ്കിട്ട ഒബ്uജക്റ്റ് എന്നാണ് അർത്ഥമാക്കുന്നത്, 6 എന്നത് പതിപ്പാണ്. അതിന്റെ ഫയലിന്റെ പേര്: /lib64/libc.so.6. യഥാർത്ഥത്തിൽ ഫയലിന്റെ പേരിലേക്കുള്ള ഒരു പ്രതീകാത്മക ലിങ്കാണ് സോനാം എന്നത് ശ്രദ്ധിക്കുക.

പങ്കിട്ട ലൈബ്രറികൾ ലോഡ് ചെയ്യുന്നത് ld.so (അല്ലെങ്കിൽ ld.so.x), ld-linux.so (അല്ലെങ്കിൽ ld-linux.so.x) പ്രോഗ്രാമുകളാണ്, ഇവിടെ x എന്നത് പതിപ്പാണ്. Linux-ൽ, /lib/ld-linux.so.x ഒരു പ്രോഗ്രാം ഉപയോഗിക്കുന്ന എല്ലാ പങ്കിട്ട ലൈബ്രറികളും തിരയുകയും ലോഡ് ചെയ്യുകയും ചെയ്യുന്നു.

ഒരു പ്രോഗ്രാമിന് ലൈബ്രറിയുടെ പേരോ ഫയലിന്റെ പേരോ ഉപയോഗിച്ച് ഒരു ലൈബ്രറിയെ വിളിക്കാൻ കഴിയും, കൂടാതെ ഒരു ലൈബ്രറി പാത്ത് ഫയൽസിസ്റ്റത്തിൽ ലൈബ്രറികൾ കണ്ടെത്താനാകുന്ന ഡയറക്ടറികൾ സംഭരിക്കുന്നു. സ്ഥിരസ്ഥിതിയായി, ലൈബ്രറികൾ സ്ഥിതി ചെയ്യുന്നത് /usr/local/lib, /usr/local/lib64, /usr/lib, /usr/lib64; സിസ്റ്റം സ്റ്റാർട്ടപ്പ് ലൈബ്രറികൾ /lib, /lib64 എന്നിവയിലാണ്. എന്നിരുന്നാലും, പ്രോഗ്രാമർമാർക്ക് ഇഷ്ടാനുസൃത ലൊക്കേഷനുകളിൽ ലൈബ്രറികൾ ഇൻസ്റ്റാൾ ചെയ്യാൻ കഴിയും.

കമാൻഡ്-ലൈൻ എഡിറ്റർ ഉപയോഗിച്ച് നിങ്ങൾക്ക് എഡിറ്റ് ചെയ്യാൻ കഴിയുന്ന /etc/ld.so.conf ഫയലിൽ ലൈബ്രറി പാത്ത് നിർവചിക്കാവുന്നതാണ്.

# vi /etc/ld.so.conf 

/etc/ld.so.conf.d-ൽ ഫയൽ ലോഡ് ചെയ്യാൻ ഈ ഫയലിലെ വരി(കൾ) കേർണലിനോട് നിർദ്ദേശിക്കുന്നു. ഇതുവഴി, പാക്കേജ് പരിപാലിക്കുന്നവർക്കോ പ്രോഗ്രാമർമാർക്കോ അവരുടെ ഇഷ്uടാനുസൃത ലൈബ്രറി ഡയറക്uടറികൾ തിരയൽ ലിസ്റ്റിലേക്ക് ചേർക്കാൻ കഴിയും.

നിങ്ങൾ /etc/ld.so.conf.d ഡയറക്uടറിയിലേക്ക് നോക്കുകയാണെങ്കിൽ, ചില പൊതു പാക്കേജുകൾക്കായുള്ള .conf ഫയലുകൾ നിങ്ങൾ കാണും (ഈ സാഹചര്യത്തിൽ കേർണൽ, mysql, 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 പരിശോധിച്ചാൽ, പാക്കേജ് ലൈബ്രറികളിലേക്കുള്ള ഒരു സമ്പൂർണ്ണ പാത നിങ്ങൾ കാണും.

# cat mariadb-x86_64.conf

/usr/lib64/mysql

മുകളിലുള്ള രീതി ലൈബ്രറി പാതയെ ശാശ്വതമായി സജ്ജമാക്കുന്നു. ഇത് താൽക്കാലികമായി സജ്ജീകരിക്കുന്നതിന്, കമാൻഡ് ലൈനിൽ LD_LIBRARY_PATH പരിസ്ഥിതി വേരിയബിൾ ഉപയോഗിക്കുക. മാറ്റങ്ങൾ ശാശ്വതമായി നിലനിർത്താൻ നിങ്ങൾ ആഗ്രഹിക്കുന്നുവെങ്കിൽ, ഷെൽ ഇനീഷ്യലൈസേഷൻ ഫയലിൽ /etc/profile (global) അല്ലെങ്കിൽ ~/.profile (ഉപയോക്തൃ-നിർദ്ദിഷ്ടം) എന്നതിൽ ഈ വരി ചേർക്കുക.

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

ഷെയർ ചെയ്ത ലൈബ്രറികളെ എങ്ങനെ കൈകാര്യം ചെയ്യാം എന്ന് നോക്കാം. ഒരു ബൈനറി ഫയലിനായി പങ്കിട്ട എല്ലാ ലൈബ്രറി ഡിപൻഡൻസികളുടെയും ഒരു ലിസ്റ്റ് ലഭിക്കുന്നതിന്, നിങ്ങൾക്ക് ldd യൂട്ടിലിറ്റി ഉപയോഗിക്കാം. ldd യുടെ ഔട്ട്പുട്ട് രൂപത്തിലാണ്:

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

ഈ കമാൻഡ് 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)

പങ്കിട്ട ലൈബ്രറികൾ പല ഡയറക്uടറികളിലും നിലനിൽക്കുമെന്നതിനാൽ, ഒരു പ്രോഗ്രാം സമാരംഭിക്കുമ്പോൾ ഈ ഡയറക്uടറികളിലെല്ലാം തിരയുന്നത് വളരെ കാര്യക്ഷമമല്ല: ഡൈനാമിക് ലൈബ്രറികളുടെ പോരായ്മകളിൽ ഒന്നാണിത്. അതിനാൽ, ldconfig എന്ന പ്രോഗ്രാം നടപ്പിലാക്കുന്ന കാഷിംഗ് സംവിധാനം ഉപയോഗിക്കുന്നു.

സ്ഥിരസ്ഥിതിയായി, ldconfig /etc/ld.so.conf ന്റെ ഉള്ളടക്കം വായിക്കുന്നു, ഡൈനാമിക് ലിങ്ക് ഡയറക്ടറികളിൽ ഉചിതമായ പ്രതീകാത്മക ലിങ്കുകൾ സൃഷ്ടിക്കുന്നു, തുടർന്ന് /etc/ld.so.cache-ലേക്ക് ഒരു കാഷെ എഴുതുന്നു, അത് മറ്റ് പ്രോഗ്രാമുകൾ എളുപ്പത്തിൽ ഉപയോഗിക്കും. .

നിങ്ങൾ പുതിയ പങ്കിട്ട ലൈബ്രറികൾ ഇൻസ്റ്റാൾ ചെയ്യുകയോ നിങ്ങളുടേത് സൃഷ്uടിക്കുകയോ അല്ലെങ്കിൽ പുതിയ ലൈബ്രറി ഡയറക്ടറികൾ സൃഷ്uടിക്കുകയോ ചെയ്യുമ്പോൾ ഇത് വളരെ പ്രധാനമാണ്. മാറ്റങ്ങൾ വരുത്താൻ നിങ്ങൾ ldconfig കമാൻഡ് പ്രവർത്തിപ്പിക്കേണ്ടതുണ്ട്.

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

നിങ്ങളുടെ പങ്കിട്ട ലൈബ്രറി സൃഷ്ടിച്ച ശേഷം, നിങ്ങൾ അത് ഇൻസ്റ്റാൾ ചെയ്യേണ്ടതുണ്ട്. നിങ്ങൾക്ക് ഒന്നുകിൽ മുകളിൽ പറഞ്ഞിരിക്കുന്ന ഏതെങ്കിലും സ്റ്റാൻഡേർഡ് ഡയറക്ടറികളിലേക്ക് അത് നീക്കി ldconfig കമാൻഡ് പ്രവർത്തിപ്പിക്കാം.

പകരമായി, സോനാമിൽ നിന്ന് ഫയലിന്റെ പേരിലേക്ക് പ്രതീകാത്മക ലിങ്കുകൾ സൃഷ്ടിക്കുന്നതിന് ഇനിപ്പറയുന്ന കമാൻഡ് പ്രവർത്തിപ്പിക്കുക:

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

നിങ്ങളുടെ സ്വന്തം ലൈബ്രറികൾ സൃഷ്ടിക്കുന്നത് ആരംഭിക്കുന്നതിന്, ലിനക്സ് ഡോക്യുമെന്റേഷൻ പ്രോജക്റ്റിൽ (TLDP) നിന്നുള്ള ഈ ഗൈഡ് പരിശോധിക്കുക.

ഇപ്പോഴത്തേക്ക് ഇത്രമാത്രം! ഈ ലേഖനത്തിൽ, ഞങ്ങൾ നിങ്ങൾക്ക് ലൈബ്രറികളെക്കുറിച്ചുള്ള ഒരു ആമുഖം നൽകുകയും പങ്കിട്ട ലൈബ്രറികളെക്കുറിച്ചും ലിനക്സിൽ അവ എങ്ങനെ കൈകാര്യം ചെയ്യാമെന്നും വിശദീകരിച്ചു. നിങ്ങൾക്ക് പങ്കിടാൻ എന്തെങ്കിലും ചോദ്യങ്ങളോ അധിക ആശയങ്ങളോ ഉണ്ടെങ്കിൽ, ചുവടെയുള്ള അഭിപ്രായ ഫോം ഉപയോഗിക്കുക.