2013-08-13 7 views
8

ब्लॉग लेख "LD_LIBRARY_PATH – or: How to get yourself into trouble!" डीटीयू कम्प्यूटिंग केंद्र द्वारा राज्यों:क्या एलडी_LIBRARY_PATH वास्तव में असंगतता का कारण बनता है?

3. असंगति: यह सबसे आम समस्या है। LD_LIBRARY_PATH किसी साझा लाइब्रेरी को लोड करने के लिए किसी एप्लिकेशन को मजबूर करता है जो इसे के विरुद्ध लिंक नहीं किया गया था, और यह मूल संस्करण के साथ संगत नहीं है। यह या तो बहुत स्पष्ट हो सकता है, यानी एप्लिकेशन दुर्घटनाग्रस्त हो सकता है, या इससे गलत परिणाम हो सकते हैं, यदि उठाया गया लाइब्रेरी मूल संस्करण के अनुसार काफी कुछ नहीं करता है। खासकर उत्तरार्द्ध कभी-कभी डीबग करना मुश्किल होता है।

क्या यह है वास्तव में सच है? LD_LIBRARY_PATH हमें गतिशील पुस्तकालयों के लिए खोज पथ को संशोधित करने की अनुमति देता है, लेकिन क्या यह है वास्तव मेंsoname लुकअप को दबाने के लिए बाइनरी संगतता सुनिश्चित करता है?

(क्योंकि, मेरी व्याख्या द्वारा, Program Library HOWTO इस तरह के किसी भी बात कहता है नहीं।)

या लेखक एक सुसंगत पुस्तकालय संस्करण योजना को बनाए रखने, और इसलिए यह सोचते हैं कि एक की अवधारणा के बारे में पता है में नहीं है प्रश्न में लाइब्रेरी के लिए उपयोग करें?

+0

आप कहाँ हो रही है से निर्दिष्ट एक पुस्तकालय के बजाय लोड किया जाएगा डिफ़ॉल्ट पथ (/lib और /usr/lib)

"यह करता है * वास्तव में * से * soname * लुकअप "दबाओ? – trojanfoe

+0

@trojanfoe: बाइनरी संगतता ("क्या यह वही लाइब्रेरी है जिसके खिलाफ प्रोग्राम मूल रूप से जुड़ा हुआ था?") _soname_ की जांच करके स्थापित किया गया है। –

+0

ठीक है, लेकिन क्यों दावा है कि '$ LD_LIBRARY_PATH' का उपयोग करने से इस तरह के द्विआधारी संगतता परीक्षणों से बचा जाता है? कथन "मूल संस्करण के साथ संगत नहीं है" कार्यात्मक असंगतता का जिक्र है और बाइनरी असंगतता (AFAIK) नहीं है। – trojanfoe

उत्तर

5

मुझे लगता है कि एलडी_LIBRARY का उपयोग केवल परीक्षण के लिए किया जाना चाहिए, न कि अंतिम स्थापना के लिए, क्योंकि यह मानक लाइब्रेरी स्थान का उपयोग करने से पहले निर्दिष्ट पुस्तकालय का उपयोग करने की अनुमति देता है। लेकिन लिनक्स प्रलेखन प्रोजेक्ट यह एलडी_LIBRARY_PATH के बारे में कहता है और इसे जितना संभव हो उतना स्पष्ट रखता है।

3.3.1। एलडी_LIBRARY_PATH

आप इस विशेष निष्पादन के लिए अस्थायी रूप से एक अलग लाइब्रेरी को प्रतिस्थापित कर सकते हैं। लिनक्स में, पर्यावरण परिवर्तनीय LD_LIBRARY_PATH एक निर्देशिकाओं के कोलन से अलग सेट है जहां पुस्तकालयों को निर्देशिका के मानक सेट से पहले, पहले के लिए खोजा जाना चाहिए; यह उपयोगी है जब एक नई लाइब्रेरी डीबगिंग या विशेष उद्देश्यों के लिए गैर मानक पुस्तकालय का उपयोग करना उपयोगी है। पर्यावरण परिवर्तनीय LD_PRELOAD सूचीबद्ध पुस्तकालय मानक सेट को ओवरराइड करने वाले फ़ंक्शंस के साथ सूचीबद्ध करता है, जैसे कि /etc/ld.so.preload करता है। ये लोडर /lib/ld-linux.so द्वारा कार्यान्वित किए जाते हैं। मुझे ध्यान रखना चाहिए कि, जबकि LD_LIBRARY_PATH पर कई यूनिक्स-जैसी प्रणालियों पर काम करता है, यह सभी पर काम नहीं करता है; उदाहरण के लिए, यह कार्यक्षमता एचपी-यूएक्स पर उपलब्ध है लेकिन पर्यावरण परिवर्तनीय SHLIB_PATH के रूप में, और AIX पर यह कार्यक्षमता परिवर्तनीय LIBPATH (उसी वाक्यविन्यास के साथ, एक कोलन-पृथक सूची) के माध्यम से है।

एलडी_LIBRARY_PATH विकास और परीक्षण के लिए आसान है, लेकिन सामान्य उपयोगकर्ताओं द्वारा सामान्य उपयोग के लिए एक इंस्टॉलेशन प्रक्रिया द्वारा संशोधित नहीं होना चाहिए; क्यों देखें 'क्यों LD_LIBRARY_PATH खराब है' http://www.visi.com/~barr/ldpath.html पर क्यों स्पष्टीकरण के लिए। लेकिन यह अभी भी विकास या परीक्षण के लिए उपयोगी है, और समस्याओं के आसपास काम करने के लिए जो अन्यथा आसपास काम नहीं किया जा सकता है। यदि आप नहीं चाहते हैं तो LD_LIBRARY_PATH पर्यावरण चर सेट करें, लिनक्स पर आप प्रोग्राम लोडर को सीधे भी आमंत्रित कर सकते हैं और इसे तर्क दे सकते हैं।उदाहरण के लिए, निम्नलिखित वातावरण चर LD_LIBRARY_PATH की सामग्री के बजाय दिए गए पथ का उपयोग करेगा, और दिए गए निष्पादन चलाएँ:

/lib/ld-linux.so.2 --library-पथ पथ निष्पादन योग्य

बस तर्क के बिना ld-linux.so निष्पादित करने से आपको का उपयोग करने में मदद मिलेगी, लेकिन फिर, सामान्य उपयोग के लिए इसका उपयोग न करें - ये सभी डिबगिंग के लिए लक्षित हैं।

से अगस्त 13 वीं 2013 में लिया: http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html

दस्तावेज़ के अंदर लिंक पुराना है, पाया एक यहाँ इरादा लेख: http://xahlee.info/UnixResource_dir/_/ldpath.html

संपादित

आप लाइब्रेरी ओवरराइड कर सकते हैं जिसमें ld.so रनटाइम पर लोड करने के लिए लाइब्रेरी को देखने के क्रम में बिल्डिंग/इंस्टॉलेशन के दौरान एक प्रोग्राम जुड़ा हुआ है। एक पुस्तकालय एक स्थान डी पर्यावरण चर LD_LIBRARY_PATH अंदर निर्दिष्ट में में पाया man 8 ld.so

ld.so loads the shared libraries needed by a program, prepares the pro‐ 
    gram to run, and then runs it. Unless explicitly specified via the 
    -static option to ld during compilation, all Linux programs are incom‐ 
    plete and require further linking at run time. 

    The necessary shared libraries needed by the program are searched for 
    in the following order 

    o  Using  the  environment  variable  LD_LIBRARY_PATH 
      (LD_AOUT_LIBRARY_PATH for a.out programs). Except if the exe‐ 
      cutable is a setuid/setgid binary, in which case it is ignored. 

    o  From the cache file /etc/ld.so.cache which contains a compiled 
      list of candidate libraries previously found in the augmented 
      library path. Libraries installed in hardware capabilities 
      directories (see below) are prefered to other libraries. 

    o  In the default path /lib, and then /usr/lib. 
+0

तो, आप क्या कह रहे हैं, "नहीं, ब्लॉग लेखक गलत है"? –

+0

@LightnessRacesinOrbit मुझे लगता है कि लेखक सही है। चूंकि कोई डिफ़ॉल्ट लाइब्रेरी को "ओवरराइड" कर सकता है। मैंने एक बार एक मशीन विजन कैमरा प्राप्त किया था जिसे एक करीबी स्रोत लाइब्रेरी द्वारा नियंत्रित किया गया था, जो ओपनसोर्स xerces XML लाइब्रेरी का उपयोग करता था। मेरा भंडार मुझे xerces का एक संस्करण प्रदान करेगा जो कैमरा लाइब्रेरी से जुड़ा हुआ था उससे कहीं अधिक नया था। कौन जानता है कि रनटाइम पर कैमरा लाइब्रेरी कितनी अच्छी तरह से काम करेगी, मुझे अपनी सिस्टम xerces लाइब्रेरी मिलती है। उल्लेख नहीं है कि अगर मैं स्थापित नहीं हूं तो मुझे एलडी_LIBRARY_PATH निर्यात करने की आवश्यकता है और साथ ही साथ मेरे ऐप्स चलाने के लिए भी बोझिल है। – hetepeperfan

+0

लेखक का दावा है कि आप "डिफ़ॉल्ट" लाइब्रेरी को उस सीमा तक "ओवरराइड" कर सकते हैं, जिस पर बाइनरी संगतता को अनदेखा किया जाता है। आपका स्वयं का उत्तर और मेरा अनुभव, साथ ही मैंने जो भी दस्तावेज पढ़ा है, विपरीत है। तो यह कौन है ?! –

संबंधित मुद्दे