रनटाइम के दौरान निष्पादन योग्य साझा वस्तुओं को कहां देखते हैं?


101

मैं समझता हूं कि लिंकिंग / संकलित समय पर साझा किए गए ऑब्जेक्ट को कैसे परिभाषित किया जाए। हालाँकि, मुझे अभी भी आश्चर्य है कि *.soनिष्पादन के समय निष्पादन वस्तुएं साझा वस्तु ( पुस्तकालयों) के लिए कैसे दिखती हैं ।

उदाहरण के लिए, मेरा ऐप पुस्तकालय a.outमें परिभाषित कार्य कहता है lib.so। संकलन करने के बाद, मैं अपने lib.soमें एक नई निर्देशिका की ओर बढ़ता हूं $HOME

मैं a.outइसे वहां देखने के लिए कैसे कह सकता हूं ?

जवाबों:


101

साझा लाइब्रेरी विधिपत्र शामिल तंत्र के सबसे बताते हैं, और गतिशील लोडर मैनुअल और अधिक विस्तार में चला जाता है। प्रत्येक यूनिक्स संस्करण का अपना तरीका है, लेकिन अधिकांश एक ही निष्पादन योग्य प्रारूप ( ईएलएफ ) का उपयोग करते हैं और समान गतिशील लिंकर (सोलारिस से व्युत्पन्न) होते हैं। नीचे मैं लिनक्स पर ध्यान देने के साथ सामान्य व्यवहार को संक्षेप में बताऊंगा; पूरी कहानी के लिए अपने सिस्टम के मैनुअल की जाँच करें।

संक्षेप में, जब यह एक गतिशील पुस्तकालय ( .soफ़ाइल) की तलाश में है, तो लिंकर कोशिश करता है:

  • LD_LIBRARY_PATHपर्यावरण चर में सूचीबद्ध निर्देशिका ( DYLD_LIBRARY_PATHOSX पर);
  • निर्देशिका निष्पादन योग्य rpath में सूचीबद्ध ;
  • सिस्टम खोज पथ पर निर्देशिका, जो (कम से कम लिनक्स पर) /etc/ld.so.confप्लस /libऔर में प्रविष्टियों के होते हैं /usr/lib

Rpath को निष्पादनीय (यह DT_RPATHया DT_RUNPATHगतिशील विशेषता) में संग्रहीत किया जाता है । इसमें निरपेक्ष पथ या पथ शामिल हो सकते हैं $ORIGIN, जो निष्पादन योग्य के स्थान के सापेक्ष पथ को इंगित करने के लिए शुरू होते हैं (जैसे कि यदि निष्पादन योग्य है /opt/myapp/binऔर इसका rpath है $ORIGIN/../lib:$ORIGIN/../pluginsतो गतिशील लिंकर अंदर दिखेगा /opt/myapp/libऔर /opt/myapp/plugins)। Rpath सामान्य रूप से निर्धारित किया जाता है जब निष्पादन योग्य संकलित किया जाता है, -rpathविकल्प के साथ ld, लेकिन आप इसे बाद में बदल सकते हैं chrpath

आपके द्वारा वर्णित परिदृश्य में, यदि आप एप्लिकेशन के डेवलपर या पैकेजर हैं और इसे एक …/bin, …/libसंरचना में स्थापित करने का इरादा रखते हैं , तो इसके साथ लिंक करें -rpath='$ORIGIN/../lib'। यदि आप अपने सिस्टम पर एक पूर्व-निर्मित बाइनरी स्थापित कर रहे हैं, या तो लाइब्रेरी को खोज पथ पर निर्देशिका में डाल दें ( /usr/local/libयदि आप सिस्टम व्यवस्थापक हैं, अन्यथा एक निर्देशिका जिसे आप जोड़ते हैं $LD_LIBRARY_PATH), या प्रयास करें chrpath


3
कुछ सिस्टम पर, /lib64और /usr/lib6464 बिट binaries के लिए उपयोग किया जाता है और /libऔर /usr/lib32 बिट binaries के लिए उपयोग किया जाता है।
मार्क लकाटा

यह सही जवाब ldconfig के बारे में कुछ क्यों नहीं बोलता है ??
संभावना

1
@LovesProbability क्योंकि यह सवाल था कि एग्जीक्यूटिव लाइब्रेरीज़ की तलाश में कहाँ हैं, जिसमें शामिल नहीं है ldconfigldconfigजब आप लाइब्रेरी स्थापित करते हैं तो उसमें शामिल हो जाता है।
गाइल्स

1
ध्यान दें कि *.soपुस्तकालयों के लिए "सिस्टम खोज पथ" समान नहीं है $PATH। खोज पथ उनके जवाब में @enzotib द्वारा दिया गया है। खोजे जाने वाले रास्तों का पता लगाने के लिए दौड़ें ldconfig -v 2>/dev/null | grep -v ^$'\t'
एंड्रयू बेट

मेरे लिए, ldconfig चलाने के लिए, मुझे /sbin/ldconfigएंड्रयू बेते के अन्य जादू की जरूरत है और इसे गैर-रूट पर चलाने के लिए
रॉबर्ट लैग

16

लिनक्स में ld(1)मैन पेज में व्यवहार का पता लगाया जाता है

       The linker uses the following search paths to locate required
       shared libraries:

       1.  Any directories specified by -rpath-link options.

       2.  Any directories specified by -rpath options.  The difference
           between -rpath and -rpath-link is that directories specified by
           -rpath options are included in the executable and used at
           runtime, whereas the -rpath-link option is only effective at
           link time. Searching -rpath in this way is only supported by
           native linkers and cross linkers which have been configured
           with the --with-sysroot option.

       3.  On an ELF system, for native linkers, if the -rpath and
           -rpath-link options were not used, search the contents of the
           environment variable "LD_RUN_PATH".

       4.  On SunOS, if the -rpath option was not used, search any
           directories specified using -L options.

       5.  For a native linker, the search the contents of the environment
           variable "LD_LIBRARY_PATH".

       6.  For a native ELF linker, the directories in "DT_RUNPATH" or
           "DT_RPATH" of a shared library are searched for shared
           libraries needed by it. The "DT_RPATH" entries are ignored if
           "DT_RUNPATH" entries exist.

       7.  The default directories, normally /lib and /usr/lib.

       8.  For a native linker on an ELF system, if the file
           /etc/ld.so.conf exists, the list of directories found in that
           file.

       If the required shared library is not found, the linker will issue
       a warning and continue with the link.

1
"डिफ़ॉल्ट निर्देशिका, सामान्य रूप से / देय और / usr / lib।" -> अगर मेरा सिस्टम सामान्य है तो मुझे कैसे पता चलेगा?
थोरस्टेन स्टैकर

2
सवाल रनटाइम के बारे में है और लिंक टाइम के बारे में नहीं है
Talespin_Kit

2

मुझे पूरा यकीन है कि इसका जवाब यहाँ है ldconfig

ldconfig कमांड लाइन पर फ़ाइल /etc/ld.so.conf में, और विश्वसनीय निर्देशिकाओं (/ lib और usr / lib) में निर्दिष्ट निर्देशिकाओं में पाए जाने वाले सबसे हाल ही में साझा किए गए पुस्तकालयों के लिए आवश्यक लिंक और कैश बनाता है। कैश का उपयोग रन-टाइम लिंकर, ld.so या ld-linux.so द्वारा किया जाता है। ldconfig हेडर की जाँच करता है और पुस्तकालयों के फ़ाइलनामों से यह पता चलता है कि किन संस्करणों को उनके लिंक अपडेट किए जाने चाहिए।

http://linux.die.net/man/8/ldconfig


0

एप्लिकेशन चलाने के लिए फ़ाइल /proc/1234/mapsमें सभी वास्तविक गतिशील रूप से जुड़े पुस्तकालय हैं।

जहां 1234चल निष्पादन योग्य है।

लिनक्स LD_LIBRARY_PATH और अन्य चर का अनुसरण करता है, जैसा कि गिल्स द्वारा उत्तर दिया गया है।


4
यह अच्छा है कि आप अपने दूसरे वाक्य में पुष्टि करते हैं कि गिलेस उत्तर मदद करता है। पहला भाग हालांकि यह बताने में कोई योगदान नहीं देता है कि फाइलों को कैसे बताया जाए, जहां केवल पहले ही मिल गए हों, जहां से प्राप्त हुए थे। इन सब में सिर्फ एक टिप्पणी होनी चाहिए, एक उत्तर नहीं।
एंथन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.