क्या आदेश है कि लिनक्स के गतिशील लिंकर खोज करता है?


14

यह कोई डुप्लिकेट नहीं है क्योंकि यह मेरे द्वारा उपयोग किए जाने पर मेरे द्वारा देखी गई ख़ासियत से निपट रहा है /etc/ld.so.conf।

पुस्तकालयों के लिए गतिशील लिंकर खोज करने वाले रास्तों को प्राप्त करने के लिए, मैं कमांड चलाता हूं ldconfig -v | grep -v "^"$'\t' | sed "s/:$//g"। जब /etc/ld.so.confइसमें कोई पथ सूचीबद्ध नहीं है। पिछले कमांड से आउटपुट है

/lib
/usr/lib

मुझे लगा कि यह /libपहले और फिर खोज करता है /usr/lib। जब मैं एक नया पथ जोड़ता हूं, जैसे कि /usr/local/lib, /etc/ld.so.confतब और फिर रीमेक /etc/ld.so.cache, से आउटपुट ldconfig -v | grep -v "^"$'\t' | sed "s/:$//g"बन जाता है

/usr/local/lib
/lib
/usr/lib

मैं यह अजीब है क्योंकि अगर मैं सही है कि आदेश है कि सूचीबद्ध निर्देशिका में खोजे जाते हैं, ऊपर से नीचे तक है कर रहा हूँ, तो अतिरिक्त निर्देशिका से पहले की खोज कर रहे हैं /libऔर /usr/lib। अतिरिक्त निर्देशिका भरोसा निर्देशिका से पहले की खोज कर रहे हैं यही कारण है कि अपने आप ही अजीब नहीं है, लेकिन जब /libसे पहले की खोज कर रहा है /usr/lib, जो अजीब है, क्योंकि /binऔर /sbinबाद की खोज कर रहे हैं /usr/binऔर /usr/sbinमें PATH।

यहां तक ​​कि अगर सूचीबद्ध किए ldconfig -v | grep -Ev "^"$'\t' | sed "s/:$//g"गए रास्तों को नीचे से ऊपर तक खोजा गया था, तब भी यह एक तिरछा क्रम होगा क्योंकि अतिरिक्त निर्देशिकाओं को विश्वसनीय लोगों के बाद खोजा जाएगा, जबकि /libबाद में खोजा जाएगा /usr/lib।

तो, वह कौन सा आदेश है जो ld.soपुस्तकालयों के लिए मार्ग खोजता है? /libपहले क्यों खोजा गया है /usr/lib? यदि यह नहीं है, तो अतिरिक्त निर्देशिकाओं की खोज आखिर क्यों की जाती है /lib?

जवाबों:


17

आदेश गतिशील लिंकर के मैनुअल में प्रलेखित है, जो है ld.so। यह है:

  1. निर्देशिका से LD_LIBRARY_PATH;
  2. निर्देशिका से /etc/ld.so.conf;
  3. /lib;
  4. /usr/lib।

(मैं थोड़ा सरल कर रहा हूं, पूर्ण विवरण के लिए मैनुअल देखें।)

जब आप समझते हैं कि यह एक कस्टम लाइब्रेरी के साथ एक डिफ़ॉल्ट स्थान पर लाइब्रेरी को ओवरराइड करने का एकमात्र तरीका है, तो आदेश समझ में आता है। LD_LIBRARY_PATHएक उपयोगकर्ता सेटिंग है, इसे दूसरों के सामने आना होगा। /etc/ld.so.confस्थानीय सेटिंग है, यह ऑपरेटिंग सिस्टम डिफ़ॉल्ट से पहले आता है। इसलिए एक उपयोगकर्ता के रूप में, यदि मैं किसी लाइब्रेरी के किसी भिन्न संस्करण के साथ कोई प्रोग्राम चलाना चाहता हूं, तो मैं LD_LIBRARY_PATHउस भिन्न लाइब्रेरी संस्करण के स्थान वाले प्रोग्राम को चला सकता हूं । और एक प्रशासक के रूप में, मैं पुस्तकालय के एक अलग संस्करण को अंदर /usr/local/libऔर सूची /usr/local/libमें रख सकता हूं /etc/ld.so.conf।

ट्रस्ट इसमें प्रवेश नहीं करता है। इस खोज पथ पर सूचीबद्ध किसी भी निर्देशिका पर भरोसा किया जाना चाहिए, क्योंकि किसी भी पुस्तकालय को वहां से लोड किया जा सकता है। सिद्धांत रूप में, आप अपने सिस्टम पर "अधिक विश्वास की आवश्यकता" सभी कार्यक्रमों द्वारा उपयोग किए जाने वाले पुस्तकालय नामों को सूचीबद्ध कर सकते हैं और सुनिश्चित कर सकते हैं कि ये सभी लाइब्रेरी "सबसे विश्वसनीय" निर्देशिकाओं में मौजूद हैं, और फिर "कम विश्वसनीय" निर्देशिकाएं नहीं होंगी। यदि वे "कम विश्वास की आवश्यकता" वाले कार्यक्रमों को छोड़कर, खोज पथ पर अधिक विश्वसनीय निर्देशिकाओं के बाद आए, तो उनका उपयोग किया जाए। लेकिन यह बेहद नाजुक होगा। यह भी बहुत व्यर्थ होगा: यदि कोई हमलावर LD_LIBRARY_PATHया किसी तत्व के मूल्य को इंजेक्ट कर सकता है /etc/ld.so.conf, तो निश्चित रूप से उनके पास मनमाने कोड को निष्पादित करने के लिए एक अधिक सीधा रास्ता होगा, जैसे कि PATH, के मूल्य को इंजेक्ट करना ,LD_PRELOAD, आदि पुस्तकालय लोड पथ पर भरोसा करता है जब निष्पादन एक विश्वास सीमा पार करता है, यानी जब अतिरिक्त विशेषाधिकारों (जैसे सेतु / सेटगिड प्रोग्राम, या के माध्यम से sudo) के साथ एक कार्यक्रम चलाते हैं । इस मामले में जो होता है, वह LD_LIBRARY_PATHहै।

के रूप में /libबनाम /usr/lib, यह ज्यादा बात नहीं करता है: वे एक ही इकाई (ऑपरेटिंग सिस्टम) द्वारा प्रदान की कर रहे हैं और वहाँ एक पुस्तकालय है कि दोनों में मौजूद है नहीं होना चाहिए। यह /libपहली बार सूचीबद्ध करने के लिए समझ में आता है क्योंकि यह एक (बहुत छोटा) प्रदर्शन लाभ प्रदान करता है: सबसे अधिक इस्तेमाल किया जाने वाला पुस्तकालय, विशेष रूप से छोटे बुनियादी कार्यक्रमों द्वारा उपयोग किए जाने वाले पुस्तकालय (जिसके लिए लोड समय बड़े, लंबे समय की तुलना में कुल चलने का एक उच्च अंश है) -आकर्षक कार्यक्रम), में स्थित हैं /lib।


यदि कई निर्देशिका LD_LIBRARY_PATH में सूचीबद्ध हैं, तो उन्हें किस क्रम में खोजा जाता है?
— argentum2f

@ argentum2f बाएं से दाएं, के समान PATH।
— गाइल्स का SO- बुराई पर रोक '
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.