2011-11-01 8 views
17

यह पृष्ठ - - http://labs.qt.nokia.com/2011/10/28/rpath-and-runpath/ ld.so में पुस्तकालय खोज के लिए आदेश के बारे में कहते हैं:RPATH का उपयोग करें लेकिन रनपत नहीं?

Unless loading object has RUNPATH: 
    RPATH of the loading object, 
     then the RPATH of its loader (unless it has a RUNPATH), ..., 
     until the end of the chain, which is either the executable 
     or an object loaded by dlopen 
    Unless executable has RUNPATH: 
     RPATH of the executable 
LD_LIBRARY_PATH 
RUNPATH of the loading object 
ld.so.cache 
default dirs 

और फिर सुझाव देते हैं:

जब आप बाइनरी जहाज, या तो RPATH का उपयोग करें और नहीं RUNPATH या LD_LIBRARY_PATH सुनिश्चित दौड़ने से पहले सेट है। क्योंकि RUNPATH तरह-के रद्द RPATH तो अप्रत्यक्ष गतिशील लोड हो रहा है अपेक्षा के अनुरूप काम नहीं करता है

तो, RUNPATH साथ RPATH का उपयोग कर बुरा है? लेकिन फिर RPATH को RUNPATH के पक्ष में क्यों हटा दिया गया?

क्या कोई स्थिति की व्याख्या कर सकता है?

उत्तर

13

जब आप बाइनरी भेजते हैं, तो उपयोगकर्ताओं को लाइब्रेरी खोज पथ समायोजित करने के अलावा, अन्य चीजों के साथ, बाइनरी को अपने सिस्टम के विनिर्देशों के लिए बाइनरी समायोजित करना अच्छा होता है।

एक उपयोगकर्ता आम तौर पर LD_LIBRARY_PATH और /etc/ld.co.conf, जो दोनों के, DT_RPATH की तुलना में कम पूर्वता के साथ कर रहे हैं, यानी आप ओवरराइड नहीं कर सकते क्या बाइनरी में hardcoded है, जबकि यदि आप DT_RUNPATH बजाय का उपयोग करें, यदि कोई उपयोगकर्ता LD_LIBRARY_PATH के साथ ओवरराइड कर सकते हैं ठीक कर सकते हैं ।

(एफडब्ल्यूआईडब्ल्यू, मुझे लगता है कि ld.so.conf को भी DT_RUNPATH से अधिक प्राथमिकता लेनी चाहिए, लेकिन, वैसे भी, हमें कम से कम LD_LIBRARY_PATH मिल गया है)।

इसके अलावा, मैं DT_RPATH का उपयोग करने के लिए ऊपर दिए गए सुझाव से असहमत हूं। आईएमओ, निचले बाइनरी में DT_RUNPATH का उपयोग करने के लिए सबसे अच्छा है।

जब तक

आप अपने निष्पादनयोग्य के साथ अपने सभी निर्भर पुस्तकालयों जहाज हैं और यह सुनिश्चित करना चाहते हैं कि चीजें JustWork (टीएम) स्थापना के बाद, इस मामले उपयोग DT_RPATH में।

+1

समस्या यह है कि RPATH पर RUNPATH की अनुशंसा की जाती है, और RPATH को बहिष्कृत किया जाता है, लेकिन वर्तमान में RUNPATH सभी सिस्टम द्वारा समर्थित नहीं है। तो मैं आवेदन ** काम करने के लिए ** आज ** क्या करता हूं? क्यूटी लेख के रूप में, प्लगइन्स का उपयोग करते समय यह RUNPATH से अधिक RPATH का उपयोग करने के लिए उपयोगी है। इसलिए पूरी स्थिति यहां बहुत भ्रमित है – zaharpopov

+1

@ ज़हरपोपोव, सबसे अच्छा तरीका जो मैं अनुशंसा करता हूं और खुद का पालन करता हूं वह उन अनुप्रयोगों का उत्पादन करना है जो लक्षित प्लेटफ़ॉर्म में अच्छी तरह से एकीकृत हैं, जिसमें अन्य चीजों के साथ, प्लेटफ़ॉर्म के प्रतिस्पर्धी संस्करणों को वितरित नहीं करना शामिल है। साझा पुस्तकालय *। मुझे लगता है कि यह समस्या की जड़ है और हैक और 'DT_RPATH' के आसपास slashes और दोस्तों को एक हल निर्देशित प्रयास है कि इसे हल करने की बजाय समस्या को हल करने का प्रयास कर रहे हैं। – chill

+1

यह आसान नहीं है। क्यूटी समस्या के साथ ऐप सिस्टम पर मौजूद क्यूटी libs के नए संस्करण चाहता है। कुछ प्रणालियों ने क्यूटी एसओएस को पुराना कर दिया है, तो आप तब क्या करेंगे? मुझे लगता है कि अगर आपको एक विशिष्ट संस्करण – zaharpopov

10

चिल का जवाब बिल्कुल सही है; मैं 2.17 में ग्लिब स्रोत ([मास्टर 8b0ccb2] के हालिया पढ़ने से हाल ही में कुछ रंग जोड़ना चाहता था)। स्पष्ट होने के लिए, यदि किसी दिए गए स्तर द्वारा निर्दिष्ट स्थान में कोई लाइब्रेरी नहीं मिली है, तो अगला स्तर आज़माया गया है। यदि किसी दिए गए स्तर पर लाइब्रेरी पाई जाती है, तो खोज बंद हो जाती है।

गतिशील लाइब्रेरी खोज आदेश:

  1. ELF बाइनरी में DT_RPATH, जब तक DT_RUNPATH सेट।
  2. LD_LIBRARY_PATH प्रविष्टियों, जब तक कि ELF द्विआधारी
  3. /etc/ld.so.cache प्रविष्टियों में setuid/setgid
  4. DT_RUNPATH, जब तक -z nodeflib लिंक समय दिए गए
  5. /lib,/usr/lib जब तक - z nodeflib
  6. हो गया, "नहीं मिला"।
4

लेकिन क्यों तो RPATH RUNPATH के पक्ष में पदावनत किया गया?

जब DT_RPATH पेश किया गया था, तो यह अन्य सभी मानकों पर प्राथमिकता थी। विकास उद्देश्यों के लिए भी लाइब्रेरी खोज पथ को ओवरराइड करना असंभव हो गया। इसलिए एक और पैरामीटर, LD_RUNPATH, पेश किया गया था जिसमें LD_LIBRARY_PATH की तुलना में कम प्राथमिकता है।

"How to write shared libraries"द्वारा लिखे गए कार्यों में अधिक जानकारी मिल सकती है Ulrich Drepper

+1

यह उत्तर 'DT_RUNPATH' की आवश्यकता बताता है, लेकिन क्यों नहीं 'DT_RPATH' को बहिष्कृत किया गया है। दोनों का अपना उपयोग होता है, और 'LT__LIBRARY_PATH' का उपयोग होने पर' DT_RUNPATH' 'libtool' तोड़ता है: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=859732 – vinc17