डायनामिक लिंकर / लोडर को `फाइल` द्वारा बताए गए अनुसार गतिशील रूप से कैसे जोड़ा जा सकता है?


12

साझा किए गए ऑब्जेक्ट निर्भरता पर विचार करें /bin/bash, जिसमें /lib64/ld-linux-x86-64.so.2(डायनेमिक लिंकर / लोडर) शामिल हैं:

ldd /bin/bash
    linux-vdso.so.1 (0x00007fffd0887000)
    libtinfo.so.6 => /lib/x86_64-linux-gnu/libtinfo.so.6 (0x00007f57a04e3000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f57a04de000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f57a031d000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f57a0652000)

निरीक्षण से /lib64/ld-linux-x86-64.so.2पता चलता है कि यह एक सहानुभूति है /lib/x86_64-linux-gnu/ld-2.28.so:

ls -la /lib64/ld-linux-x86-64.so.2 
lrwxrwxrwx 1 root root 32 May  1 19:24 /lib64/ld-linux-x86-64.so.2 -> /lib/x86_64-linux-gnu/ld-2.28.so

इसके अलावा, fileरिपोर्टें /lib/x86_64-linux-gnu/ld-2.28.soस्वयं गतिशील रूप से जुड़ी हुई हैं:

file -L /lib64/ld-linux-x86-64.so.2
/lib64/ld-linux-x86-64.so.2: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=f25dfd7b95be4ba386fd71080accae8c0732b711, stripped

मैं जानना चाहता हूं:

  1. गतिशील रूप से लिंकर / लोडर ( /lib64/ld-linux-x86-64.so.2) को गतिशील रूप से कैसे जोड़ा जा सकता है? क्या यह रनटाइम में खुद को जोड़ता है?
  2. /lib/x86_64-linux-gnu/ld-2.28.soएक। बायनेरिज़ ( man ld.so) को संभालने के लिए प्रलेखित किया गया है , लेकिन /bin/bashक्या कोई ईएलएफ निष्पादन योग्य है?

कार्यक्रम ld.so एक बायनेरी को संभालता है, एक प्रारूप जो बहुत पहले इस्तेमाल किया गया था; ld-linux.so * (/lib/ld-linux.so.1 for libc5, /lib/ld-linux.so.2 glibc2 के लिए) han‐ dles ELF, जिसका उपयोग हर कोई वर्षों से करता आ रहा है।


कर्नेल को इस तरह के सूक्ष्म वर्गीकरण स्वायत्तता के बारे में परवाह नहीं है (और न ही आपको; ;-))। कर्नेल केवल ELFs के बीच का अंतर बनाता है जिसे एक दुभाषिया की आवश्यकता होती है और जो नहीं करते हैं। और AFAIK, आप एक दुभाषिया का उपयोग नहीं कर सकते हैं जिसे स्वयं की आवश्यकता है।
मॉसवी

@StephenKitt मेरा नहीं है ( /lib/x86_64-linux-gnu/ld-2.28.so, डेबियन 10 बस्टर)
मोसवी

@mosvy हाँ, क्षमा करें, मैं इस fileबारे में गलत टिप्पणी के बीच घुलमिल गया कि यह स्थिर बायनेरिज़ को कैसे परिभाषित करता है, और ld-2.28.so... की वास्तविकता है PT_DYNAMIC
स्टीफन किट

जवाबों:


17
  1. हाँ, यह लिंक होने पर खुद को जोड़ता है। तकनीकी रूप से गतिशील लिंकर को ऑब्जेक्ट रिज़ॉल्यूशन और स्वयं के लिए स्थानांतरण की आवश्यकता नहीं है, क्योंकि यह पूरी तरह से हल के रूप में है, लेकिन यह प्रतीकों को परिभाषित करता है और इसे बाइनरी को हल करते समय उन लोगों का ख्याल रखना पड़ता है जो "व्याख्या" कर रहे हैं, और उन प्रतीकों को अपडेट किया गया है भरी हुई पुस्तकालयों में उनके कार्यान्वयन की ओर संकेत करने के लिए। विशेष रूप से, यह प्रभावित करता है malloc- लिंक करने वाले के पास एक न्यूनतम संस्करण है, जो संबंधित प्रतीक के साथ बनाया गया है, लेकिन यह सी लाइब्रेरी के संस्करण द्वारा प्रतिस्थापित होने के बाद लोड होने पर और स्थानांतरित हो जाता है (या यदि कोई एक है तो इंटरपोज्ड संस्करण द्वारा भी), कुछ देखभाल के साथ यह सुनिश्चित करने के लिए लिया जाता है कि यह उस बिंदु पर न हो जहां यह लिंकर को तोड़ सकता है।

    रक्तमय विवरण में हैं rtld.cमें, dl_mainकार्य करते हैं।

    ध्यान दें कि ld.soकोई बाहरी निर्भरता नहीं है। आप इसमें शामिल प्रतीकों को देख सकते हैं nm -D; उनमें से कोई भी अपरिभाषित नहीं है।

  2. मैनपेज केवल सीधे प्रविष्टियों के अंतर्गत संदर्भित करता है /lib, अर्थात /lib/ld.so (libc 5 डायनेमिक लिंकर, जो समर्थन करता है a.out) और /lib*/ld-linux*.so*(libc 6 डायनेमिक लिंकर, जो ELF का समर्थन करता है)। मैनपेज बहुत विशिष्ट है, और ld.soनहीं है ld-2.28.so

    वर्तमान सिस्टम के विशाल बहुमत पर पाए जाने वाले डायनेमिक लिंकर में a.outसमर्थन शामिल नहीं है ।

fileऔर lddगतिशील लिंकर के लिए अलग-अलग चीजों की रिपोर्ट करें क्योंकि उनके पास अलग-अलग परिभाषाएं हैं जो सांख्यिकीय रूप से जुड़े बाइनरी का गठन करती हैं। यदि lddकोई DT_NEEDEDप्रतीक नहीं है, यानी कोई अपरिभाषित प्रतीक नहीं है , तो एक द्विआधारी को सांख्यिकीय रूप से जोड़ा जाता है । fileयदि यह PT_DYNAMICखंड नहीं है, तो इसके लिए एक ELF बाइनरी सांख्यिकीय रूप से जुड़ा हुआ है (यह fileनिम्न 5.3 के रिलीज में बदल जाएगा । यह अब एक PT_INTERPअनुभाग की उपस्थिति का उपयोग डायनेमिक रूप से जुड़े बाइनरी के संकेतक के रूप में करता है, जो टिप्पणी से मेल खाता है। कोड)।

GNU C लाइब्रेरी डायनेमिक लिंकर में कोई भी DT_NEEDEDप्रतीक नहीं है , लेकिन इसमें एक PT_DYNAMICसेक्शन है (क्योंकि यह तकनीकी रूप से एक साझा लाइब्रेरी है)। परिणामस्वरूप, ldd(जो गतिशील लिंकर है) इंगित करता है कि यह सांख्यिकीय रूप से जुड़ा हुआ है, लेकिन fileइंगित करता है कि यह गतिशील रूप से जुड़ा हुआ है। इसमें एक PT_INTERPखंड नहीं है , इसलिए अगली रिलीज़ होने से fileयह भी संकेत मिलेगा कि यह सांख्यिकीय रूप से जुड़ा हुआ है।

$ ldd /lib64/ld-linux-x86-64.so.2
        statically linked

$ file $(readlink /lib64/ld-linux-x86-64.so.2)
/lib/x86_64-linux-gnu/ld-2.28.so: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=f25dfd7b95be4ba386fd71080accae8c0732b711, stripped

( file5.35 के साथ )

$ file $(readlink /lib64/ld-linux-x86-64.so.2)
/lib/x86_64-linux-gnu/ld-2.28.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), statically linked, BuildID[sha1]=f25dfd7b95be4ba386fd71080accae8c0732b711, stripped

(वर्तमान में विकास संस्करण के साथ file)।


डायनामिक लिंकिंग के संदर्भ में "इंटरप्रेटिंग" शब्द का उपयोग क्यों किया जाता है? उस शब्द का इस्तेमाल आमतौर पर प्रोग्रामिंग भाषाओं के संदर्भ में किया जाता है।
शुज़ेंग

"जीएनयू सी लाइब्रेरी डायनेमिक लिंकर" से आपका क्या अभिप्राय है? क्या आप /lib*/ld-linux*.so*या तीसरे डायनेमिक लिंकर का जिक्र कर रहे हैं ?
शुज़ेंग

आप lddडायनामिक लिंकर को स्टेटिकली लिंक के रूप में कहां देख सकते हैं ? क्योंकि यह साझा वस्तु निर्भरता की सूची खाली है?
शुज़ेंग

डायनामिक रूप से जुड़े कार्यक्रमों को निष्पादित करने से पहले उन्हें कुछ काम करने की आवश्यकता होती है; वह काम डायनेमिक लिंकर द्वारा किया जाता है, जो एक दुभाषिया के समान भूमिका निभाते हुए समाप्त होता है - यह रिलोकेशन टेबल्स आदि की व्याख्या करता है ताकि कुछ ऐसा बनाया जा सके जिसे कंप्यूटर चला सके।
स्टीफन किट

जब मैं कहता हूं "जीएनयू सी लाइब्रेरी डायनेमिक लिंकर", मैं जीएनयू सी लाइब्रेरी में शामिल कार्यान्वयन का उल्लेख कर रहा हूं, आमतौर पर जैसा कि भेज दिया जाता है /lib*/ld-linux*.so*। मैंने डायनेमिक लिंकर की उत्पत्ति निर्दिष्ट की क्योंकि लिनक्स के लिए अन्य कार्यान्वयन उपलब्ध हैं।
स्टीफन किट

0
  1. मुझे संदेह है कि fileप्रोग्राम गतिशील रूप से लिंकर / लोडर के गतिशील रूप से जुड़े होने के बारे में गलत है। lddकार्यक्रम सहमत नहीं है। कम से कम मेरे सिस्टम पर नहीं (डेबियन स्ट्रेच):

    ldd /lib/x86_64-linux-gnu/ld-2.24.so
        statically linked
    
  2. man ld.soयह भी पढ़ता है: "ld-linux.so * ELF को संभालता है" । आपके सिस्टम पर (और वैसे भी मेरा) दोनों एक ही बाइनरी के लिए सहानुभूति रखते हैं, जो कि मैं घटाता हूं, ELF और (पुराने अप्रचलित) a.out प्रारूप दोनों को संभालने में सक्षम है।


स्वीकृत उत्तर के लिए आप क्या जानकारी जोड़ते हैं?
चमत्कार 173

2
@ miracle173 यह उत्तर स्वीकृत उत्तर ;-) से पुराना है।
स्टीफन किट

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