2011-11-04 15 views
6

यहां मेरा परिदृश्य है:क्रोट गतिशील लिंकिंग को कैसे प्रभावित करता है?

मैंने एक डीबूटस्ट्रैप उबंटू मावेरिक (64-बिट) वातावरण बनाया है। मैंने इसे अपने यूबंटू (64-बिट) ल्यूसिड सिस्टम पर /env/mav/ पर रखा। मैं chroot/env/mav में कर सकता हूं और पूरी तरह से एक मैवेरिक सिस्टम का उपयोग कर सकता हूं।

मैं भी चिंतित वातावरण के बाहर ल्यूसिड प्रोग्राम का उपयोग कर सकता हूं। वह /env/mav/bin/ls चलाएगा।

हालांकि, मैंने देखा है कि होने के लिए अगर मैं LD_LIBRARY_PATH संशोधित /env/mav/lib [1] [2]

हर एक कार्यक्रम (दोनों स्पष्ट और आवारा) मैं तुरन्त दुर्घटना होगा चलाते हैं। (उदाहरण के लिए ls परिणाम segfault में)। kern.log पता चलता है:

segfault at 7fece284aa18 ip 00007fece284aa18 sp 00007fff32028158 error 15 

हालांकि, स्पष्ट रूप से अगर मैं /env/mav में chroot, हर कार्यक्रम ठीक चल रहा है। और सभी पुस्तकालयों को जेल से नहीं पढ़ा जा रहा है (/env/mav) /lib? तो इस संदर्भ में chroot और LD_LIBRARY_PATH के बीच अंतर क्या है?

इसके अलावा, अगर मैं:

mount -B /env /env/mav/env 

और फिर chroot /env और फिर सेट LD_LIBRARY_PATH/env/mav/lib होने के लिए, सब कुछ अभी भी ठीक से चलता है।

मैं आंतरिक रूप से यहां क्या हो रहा है इसके लिए एक नुकसान में हूं। क्या कुछ एलडी आंतरिक कहीं संग्रहीत हैं? क्या चिड़ियाघर कुछ जादुई करता है?

[1] केस का उपयोग मावेरिक पर्यावरण से प्रोग्राम चलाने के लिए सही ढंग से बाध्यकारी रूप से जुड़ी लाइब्रेरी को मावेरिक जेल के बाहर लाने के लिए किया जाता है।

[2] यह सिर्फ एक संक्षिप्त उदाहरण है। हकीकत में /usr/lib, आदि सभी शामिल हैं। मावेरिक पर्यावरण/lib "poisons" सब कुछ सहित; अन्य मावेरिक लाइब्रेरी निर्देशिकाओं का उपयोग करने में कोई समस्या नहीं है।

उत्तर

6

LD_LIBRARY_PATH ld-linux.so प्रोग्राम/लाइब्रेरी का विकल्प है। यह पुस्तकालय एक गतिशील लिंकर है। यह पथ "/lib/ld-linux.so.2" ईएलएफ हेडर (INTREP फ़ील्ड) में, उबंटू में सभी गतिशील रूप से जुड़े प्रोग्रामों में लगभग (लगभग) हार्डकोड किया गया है। मेरा मतलब है कि, जब लिनक्स कर्नेल बाइनरी फ़ाइल चलाता है, तो यह LD_LIBRARY_PATH के विशेष अर्थ के बारे में कुछ भी नहीं जानता है।

इसलिए, जब आप

LD_LIBRARY_PATH=/env/mav/ /env/mav/bin/ls 

चलाने जड़ प्रणाली के /lib/ld-linux.so.2 उपयोग किया जाएगा और फिर इसे का उपयोग कर क्या $LD_LIBRARY_PATH env चर (आप देख सकते हैं गतिशील पुस्तकालयों को हल करने की कोशिश करेंगे LD_DEBUG=all एनवी वैरिएबल का उपयोग करके गोइंड)

और जब आप एक क्रोट करते हैं, तो मैवेरिक का /lib/ld-linux.so.2 उपयोग किया जाएगा।

मुझे लगता है, वहाँ के बीच कुछ incompability हो सकता है मेजबान सिस्टम के ld-linux और अतिथि (आवारा) सिस्टम के libc.so (क्योंकि ld-linux glibc/eglibc पैकेज का हिस्सा है और यह libc.so से कुछ का उपयोग करता है)।

मेरी धारणा के परीक्षण के लिए चलाने का प्रयास (env चर सेटिंग के बैश वाक्य रचना):, (

LD_LIBRARY_PATH=/env/mav/ /env/mav/lib/ld-linux.so.2 /env/mav/bin/ls 

यहाँ मैं मैन्युअल अतिथि के ld-linux प्रारंभ करने का प्रयास क्रम INTREP hardcoded पथ अधिलेखित करने में हाँ, यह .so लाइब्रेरी चलाने के लिए असामान्य लगता है, लेकिन यह लाइब्रेरी बहुत ही खास मामला है और इस वाक्यविन्यास के लिए अनुमति देता है)। यदि यह आदेश काम करेगा, तो मेरी धारणा अच्छी हो सकती है। यदि नहीं, तो अन्य व्याख्याएं संभव हैं।

+0

लिनक्स लिंकिंग सिस्टम कैसे काम करता है इस बारे में स्पष्टीकरण के लिए धन्यवाद। पूरी तरह से काम किया। – UsAaR33

+4

libpthread.so से libc.so (LD_DEBUG का उपयोग करके) को जोड़ने के साथ हुई दुर्घटना को बदल देता है। भविष्य में आने वाले लोगों को ध्यान दें, ld.so --list, आपको विभिन्न लिंकर्स के साथ ldd करने की अनुमति देता है। – UsAaR33

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