मैं लिनक्स के तहत एक साधारण उपयोगकर्ता-स्थान ईएलएफ लोडर लिख रहा हूं (क्यों? 'मज़ा' के लिए)। इस समय मेरा लोडर काफी सरल है और केवल स्थिर-लिंक वाली ईएलएफ फ़ाइलों को लोड करने के लिए डिज़ाइन किया गया है जिसमें स्थिति-स्वतंत्र कोड है।लोड-टाइम ईएलएफ स्थानांतरण
आम तौर पर, जब कोई प्रोग्राम कर्नेल के ईएलएफ लोडर द्वारा लोड किया जाता है, तो इसे अपने स्वयं के पता स्थान में लोड किया जाता है। इस प्रकार, डेटा सेगमेंट और कोड सेगमेंट को ईएलएफ सेगमेंट में निर्दिष्ट सही आभासी पते पर लोड किया जा सकता है।
मेरे मामले में, हालांकि, मैं कर्नेल से mmap
के माध्यम से पते का अनुरोध कर रहा हूं, और ईएलएफ सेगमेंट में अनुरोध किए गए पते प्राप्त कर सकते हैं या नहीं। कोड कोड के लिए यह कोई समस्या नहीं है क्योंकि यह स्थिति स्वतंत्र है। हालांकि, यदि डेटा सेगमेंट अपेक्षित पते पर लोड नहीं होता है, तो कोड डेटा सेगमेंट में संग्रहीत कुछ भी सही ढंग से संदर्भित नहीं कर पाएगा।
दरअसल, मेरा लोडर एक साधारण असेंबली निष्पादन योग्य के साथ ठीक काम करता प्रतीत होता है जिसमें कोई डेटा नहीं होता है। लेकिन जैसे ही मैं डेटा सेगमेंट जोड़ता हूं और इसका संदर्भ देता हूं, निष्पादन योग्य सही ढंग से या SEGFAULT को चलाने में विफल रहता है।
कैसे, यदि संभव हो, तो क्या मैं सही स्थान पर इंगित करने के लिए डेटा सेगमेंट के किसी भी संदर्भ को ठीक कर सकता हूं? क्या इस उद्देश्य के लिए (स्थैतिक) ईएलएफ फ़ाइल में संग्रहीत एक स्थानांतरण अनुभाग है?
क्या कारण है एमएपीएपी() प्रक्रिया के कारण अनुरोधित पते देकर विफल रहा है 'जो एमएमएपी को पहले से ही उस पते के स्थान में आवंटित किए गए पृष्ठों को कॉल कर रहा है? –
हां, शायद यही कारण है। मैंने अपने कोड/डेटा को "रास्ते से बाहर" रखने के लिए 'ld' पूछने के बारे में सोचा था, लेकिन मैं सोच रहा था कि पहले एक सामान्य समाधान संभव था या नहीं। अगर मुझे यहां कोई प्रतिक्रिया नहीं मिलती है तो मैं आगे बढ़ सकता हूं और कोशिश कर सकता हूं। –