2015-08-20 4 views
5

यदि मैं एक सी ++ प्रोग्राम बनाना चाहता हूं जो स्थिर लाइब्रेरी से लिंक करता है, तो अंतिम निष्पादन योग्य में मेरे प्रोग्राम से कोड, और लाइब्रेरी से कोड (मुझे लगता है ...!) दोनों कोड होंगे। लेकिन मैं पूरी तरह से निश्चित नहीं हूं कि जब मैं साझा लाइब्रेरी से लिंक करता हूं तो क्या होता है।किसी साझा लाइब्रेरी से लिंक करते समय निष्पादन योग्य में क्या जोड़ा जाता है?

मान लीजिए कि मैं libfoo.so नामक लाइब्रेरी से लिंक करता हूं, CMakeLists.txt लाइन target_link_libraries(${PROJECT_NAME} foo) फ़ाइल में निर्दिष्ट करके। मुझे लगता है कि अंतिम निष्पादन योग्य में इस पुस्तकालय के बारे में कुछ जानकारी होगी, लेकिन पूर्ण कोड नहीं। यह अन्य जानकारी क्या है? और इसके अलावा, क्या पुस्तकालय को उपयोगकर्ता के सिस्टम पर libfoo.so कहा जाना चाहिए?

+0

पढ़ सकते हैं नोट: सी ++ मानक आमतौर पर गतिशील पुस्तकालयों का समर्थन नहीं करता है। स्पष्ट समर्थन के निकटतम के बारे में आपको नामस्थान स्कोप वेरिएबल्स के प्रारंभिकरण के बारे में बयान दिया गया है, संभवतः 'मुख्य' के पहले कथन के बाद देरी हो रही है। मानक में शब्द सिर्फ भ्रामक है, मुझे लगता है कि "मुख्य 'के पहले बयान की शुरुआत के बाद ही एकमात्र उचित व्याख्या है"। –

+1

निष्पादन योग्य में एक शीर्षलेख है जिसमें विभिन्न वर्गों में जानकारी शामिल है। यदि आप हेडर की खोज में रूचि रखते हैं, तो आप एल्फ़ निष्पादन योग्य पर हेडर पढ़ने के लिए लिनक्स उपयोगिता 'readelf' का उपयोग कर सकते हैं। विशेष रूप से, आपको क्रमशः गतिशील अनुभाग और प्रतीक तालिका प्रदर्शित करने के लिए '-d' और' -s' स्विच की आवश्यकता होगी। – alvits

उत्तर

6

जब आप एक गतिशील पुस्तकालय से लिंक करते हैं, तो लिंकर प्रोग्राम के गतिशील खंड में NEEDED प्रविष्टि जोड़ देगा। फिर गतिशील लोडर पुस्तकालय का पता लगाने के लिए इनका उपयोग करेगा और पुस्तकालय का उपयोग किसी अपरिभाषित गतिशील प्रतीक को हल करने के लिए करेगा।

ध्यान दें कि अपरिभाषित गतिशील प्रतीकों और गतिशील पुस्तकालयों के बीच कोई संबंध नहीं है जहां उन्हें मिलने की उम्मीद है। कभी-कभी वे एक और पुस्तकालय में पाए जाते हैं और दिलचस्प चीजें हो सकती हैं।

विशेष NEEDED प्रविष्टि में संग्रहीत नाम चाहे पुस्तकालय की गतिशील अनुभाग में एक SONAME प्रविष्टि है पर निर्भर करता है:

  • यदि वहाँ एक SONAME, तो उसकी सामग्री कार्यक्रम के NEEDED में कॉपी किया जायेगा
  • यदि कोई SONAME नहीं है, तो लिंकर कमांड में उपयोग की जाने वाली लाइब्रेरी का फ़ाइल नाम संग्रहीत किया जाएगा।

आप के साथ एक पुस्तकालय या प्रोग्राम के गतिशील खंड की सामग्री की जाँच कर सकते हैं:

$ objdump -p program 

यह कैसे व्यवहार में प्रयोग किया जाता है? खैर, सबसे अधिक (? सब) लिनक्स वितरण निम्नलिखित योजना, प्रणाली पुस्तकालयों के साथ उपयोग करें (libfoo.so लेने के लिए):

  • पुस्तकालय /usr/lib/libfoo.so.1.2 के रूप में स्थापित किया गया है या जो कुछ भी संस्करण में यह है।
  • /usr/lib/libfoo.so.1 और /usr/lib/libfoo.so नामक उस लाइब्रेरी के प्रतीकात्मक लिंक हैं।
  • लाइब्रेरी का SONAMElibfoo.so.1 है।
  • पथ /usr/lib को गतिशील लाइब्रेरी पथ के रूप में सेट किया गया है।

इस तरह, जब आप -lfoo के साथ लिंक यह सिमलिंक libfoo.so मिलेगा, लेकिन SONAMElibfoo.so.1 के रूप में रिकॉर्ड करेगा। और जब प्रोग्राम चलाया जाता है तो उसे अन्य सिम्लिंक मिल जाएगा और लाइब्रेरी लोड होगी। ताकि आप एक ABI संगत स्थापित कर सकते हैं

यह चाल प्रयोग किया जाता है, libfoo.so.1.3 सुधार हुआ है और एक ABI असंगत नए libfoo.so.2.1, और पुराने कार्यक्रम पुराने पुस्तकालय लोड होगा, जबकि नए संकलन नए पुस्तकालय का उपयोग करेगा।

यह भी ध्यान रखें कि पर्यावरण चर LD_PRELOAD, LD_LIBRARY_PATH और अन्य रनटाइम व्यवहार को प्रभावित करते हैं। अधिक जानकारी के लिए, आप man ld.so

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