लिनक्स में साझा पुस्तकालयों को समझना


प्रोग्रामिंग में, एक पुस्तकालय कोड के पूर्व संकलित टुकड़ों का एक वर्गीकरण है जिसे एक कार्यक्रम में पुन: उपयोग किया जा सकता है। पुस्तकालय प्रोग्रामर के लिए जीवन को सरल बनाते हैं, इसमें वे पुन: प्रयोज्य कार्य, दिनचर्या, कक्षाएं, डेटा संरचनाएं और इतने पर (एक अन्य प्रोग्रामर द्वारा लिखित) प्रदान करते हैं, जिसे वे अपने कार्यक्रमों में उपयोग कर सकते हैं।

उदाहरण के लिए, यदि आप एक ऐसे अनुप्रयोग का निर्माण कर रहे हैं, जिसमें गणित संचालन करने की आवश्यकता है, तो आपको उसके लिए एक नया गणित कार्य नहीं करना होगा, आप बस उस प्रोग्रामिंग भाषा के लिए पुस्तकालयों में मौजूदा कार्यों का उपयोग कर सकते हैं।

लिनक्स में पुस्तकालयों के उदाहरणों में libc (मानक C लाइब्रेरी) या glibc (मानक C लाइब्रेरी का GNU संस्करण), libcurl (मल्टीट्रोकोल फ़ाइल) शामिल हैं। हस्तांतरण पुस्तकालय), libcrypt (एन्क्रिप्शन, हैशिंग और सी में एन्कोडिंग के लिए उपयोग की जाने वाली लाइब्रेरी) और कई और।

लिनक्स पुस्तकालयों के दो वर्गों का समर्थन करता है, अर्थात्:

  • Static libraries – are bound to a program statically at compile time.
  • Dynamic or shared libraries – are loaded when a program is launched and loaded into memory and binding occurs at run time.

गतिशील या साझा पुस्तकालयों को आगे वर्गीकृत किया जा सकता है:

  • Dynamically linked libraries – here a program is linked with the shared library and the kernel loads the library (in case it’s not in memory) upon execution.
  • Dynamically loaded libraries – the program takes full control by calling functions with the library.

साझा पुस्तकालयों को दो तरीकों से नाम दिया गया है: पुस्तकालय का नाम (a.k.a सोनमे ) और "फ़ाइल नाम" (फ़ाइल कोड जो लाइब्रेरी कोड को संग्रहीत करता है) के लिए पूर्ण पथ।

उदाहरण के लिए, libame के लिए libc libc.so.6 है: जहां lib उपसर्ग है, c एक वर्णनात्मक नाम है, इसलिए इसका अर्थ साझा वस्तु है, और 6 संस्करण है। और इसका फ़ाइल नाम है: /lib64/libc.so.6 । ध्यान दें कि सोनम वास्तव में फ़ाइलनाम की एक प्रतीकात्मक कड़ी है।

साझा पुस्तकालय ld.so (या ld.so.x ) और ld-linux.so (या ld.) द्वारा लोड किए जाते हैं। linux.so.x ) प्रोग्राम, जहां x संस्करण है। लिनक्स में, /lib/ld-linux.so.x किसी प्रोग्राम द्वारा उपयोग की जाने वाली सभी साझा लाइब्रेरी को खोजता है और लोड करता है।

एक प्रोग्राम अपने पुस्तकालय के नाम या फ़ाइल नाम का उपयोग करके एक पुस्तकालय को कॉल कर सकता है, और एक लाइब्रेरी पथ स्टोर निर्देशिकाएं जहां लाइब्रेरीज़ को फ़ाइल सिस्टम में पाया जा सकता है। डिफ़ॉल्ट रूप से, लाइब्रेरी /usr/स्थानीय/lib , /usr/स्थानीय/lib64 , /usr/lib और में स्थित हैं।/usr/lib64 ; सिस्टम स्टार्टअप लाइब्रेरी /lib और /lib64 में हैं। हालांकि, प्रोग्रामर कस्टम स्थानों में लाइब्रेरी स्थापित कर सकते हैं।

लाइब्रेरी पथ को /etc/ld.so.conf फ़ाइल में परिभाषित किया जा सकता है जिसे आप कमांड लाइन संपादक के साथ संपादित कर सकते हैं।

# vi /etc/ld.so.conf 

इस फ़ाइल में मौजूद लाइन (कर्नेल) फ़ाइल को /etc/ld.so.conf.d में लोड करने का निर्देश देती है। इस तरह, पैकेज मेंटेनर या प्रोग्रामर अपनी कस्टम लाइब्रेरी निर्देशिकाओं को खोज सूची में जोड़ सकते हैं।

यदि आप /etc/ld.so.conf.d निर्देशिका में देखते हैं, तो आपको इसमें कुछ सामान्य पैकेज (कर्नेल, mysql और postgresql) के लिए .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

यदि आप mariadb-x86_64.conf पर एक नज़र डालते हैं, तो आपको पैकेज के पुस्तकालयों के लिए एक निरपेक्ष रास्ता दिखाई देगा।

# cat mariadb-x86_64.conf

/usr/lib64/mysql

ऊपर दी गई विधि पुस्तकालय पथ को स्थायी रूप से सेट करती है। इसे अस्थायी रूप से सेट करने के लिए, कमांड लाइन पर LD_LIBRARY_PATH पर्यावरण चर का उपयोग करें। यदि आप परिवर्तनों को स्थायी रखना चाहते हैं, तो इस लाइन को शेल इनिशियलाइज़ेशन फ़ाइल /etc/प्रोफाइल (वैश्विक) या ~/.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)

क्योंकि साझा लाइब्रेरी कई अलग-अलग निर्देशिकाओं में मौजूद हो सकती हैं, जब प्रोग्राम लॉन्च किया जाता है, तो इन सभी निर्देशिकाओं को खोजना बहुत ही अक्षम होगा: जो कि गतिशील पुस्तकालयों के संभावित नुकसान में से एक है। इसलिए नियोजित कैशिंग के एक तंत्र, प्रोग्राम द्वारा निष्पादित ldconfig

डिफ़ॉल्ट रूप से, ldconfig /etc/ld.so.conf की सामग्री को पढ़ता है, गतिशील लिंक निर्देशिकाओं में उचित प्रतीकात्मक लिंक बनाता है, और फिर को कैश लिखता है > /etc/ld.so.cache जो तब आसानी से अन्य कार्यक्रमों द्वारा उपयोग किया जाता है।

यह विशेष रूप से बहुत महत्वपूर्ण है जब आपने सिर्फ नई साझा लाइब्रेरी स्थापित की है या अपनी खुद की बनाई है, या नई लाइब्रेरी डायरेक्टरी बनाई है। आपको परिवर्तनों को प्रभावित करने के लिए ldconfig कमांड चलाने की आवश्यकता है।

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

अपनी साझा लाइब्रेरी बनाने के बाद, आपको इसे स्थापित करने की आवश्यकता है। आप इसे ऊपर बताई गई किसी भी मानक निर्देशिका में ले जा सकते हैं, और ldconfig कमांड चला सकते हैं।

वैकल्पिक रूप से, फ़ाइल नाम पर सोनमे से प्रतीकात्मक लिंक बनाने के लिए निम्न कमांड चलाएँ:

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

अपने स्वयं के पुस्तकालय बनाने के साथ आरंभ करने के लिए, द लिनक्स डॉक्यूमेंटेशन प्रोजेक्ट (टीएलडीपी) से इस गाइड को देखें।

अभी के लिए इतना ही! इस लेख में, हमने आपको पुस्तकालयों का परिचय दिया, साझा पुस्तकालयों की व्याख्या की और उन्हें लिनक्स में कैसे प्रबंधित किया जाए। यदि आपके पास साझा करने के लिए कोई प्रश्न या अतिरिक्त विचार हैं, तो नीचे दिए गए टिप्पणी फ़ॉर्म का उपयोग करें।