2010-02-22 14 views
12

का डायनामिक स्थानांतरण, जिज्ञासा से बाहर मुझे आश्चर्य है कि के दौरान किसी प्रोग्राम के निष्पादन के दौरान कोड का एक टुकड़ा स्थानांतरित करना संभव है। उदाहरण के लिए, मेरे पास एक फ़ंक्शन है और यह फ़ंक्शन निष्पादित होने के बाद प्रत्येक बार स्मृति में बदला जाना चाहिए। एक विचार जो हमारे दिमाग में आया ऐसा करने के लिए स्वयं-संशोधित कोड का उपयोग करना है। कुछ ऑनलाइन संसाधनों के मुताबिक, लिनक्स पर कोड को स्व-संशोधित किया जा सकता है, लेकिन फिर भी मुझे यकीन नहीं है कि ऐसा गतिशील स्थानांतरण संभव है या नहीं। क्या किसी के साथ इसका अनुभव है?कोड अनुभाग

+0

जैसा कि राइलीर सुझाव देता है, क्या सामानों को वास्तव में स्थानांतरित करने के बजाय फ़ंक्शन पॉइंटर्स के आसपास स्वैप करना आसान नहीं होगा? – joveha

उत्तर

8

हाँ गतिशील स्थानांतरण निश्चित रूप से संभव है। हालांकि, आपको यह सुनिश्चित करना होगा कि कोड पूरी तरह आत्मनिर्भर है, या यह पूर्ण संदर्भों से ग्लोबल्स/बाहरी कार्यों तक पहुंचता है। यदि आपका कोड पूरी तरह से स्वतंत्र स्थिति में हो सकता है, जिसका अर्थ यह है कि केवल एक ही संदर्भ यह है कि आप इसके सापेक्ष हैं, तो आप सेट हैं। अन्यथा आपको समय लोड करने पर फिक्सअप स्वयं करने की आवश्यकता होगी।

जीसीसी के साथ, आप स्थिति स्वतंत्र कोड उत्पन्न करने के लिए -fpic का उपयोग कर सकते हैं। लिंकर को -q या --emit-relocs पास करने से यह स्थानांतरण स्थान को छोड़ देगा। ELF specification (पीडीएफ लिंक) में इस स्थानांतरण जानकारी का उपयोग करने के तरीके के बारे में जानकारी है; यदि आप ईएलएफ का उपयोग नहीं कर रहे हैं, तो आपको अपने प्रारूप के लिए उपयुक्त दस्तावेज मिलना होगा।

0

यदि ये सभी अलग-अलग फ़ंक्शंस संकलित समय पर मौजूद हैं तो आप केवल अगले फंक्शन को ट्रैक करने के लिए फ़ंक्शन पॉइंटर का उपयोग कर सकते हैं जिसे कॉल किया जाना है। यदि आपको रनटाइम पर फ़ंक्शन को बिल्कुल संशोधित करना है और वह संशोधन जगह पर नहीं किया जा सकता है तो आप एक फ़ंक्शन पॉइंटर का भी उपयोग कर सकते हैं जिसे नए फ़ंक्शन के पते के साथ अपडेट/लोड होने पर अपडेट किया जाता है। आपके बाकी सिस्टम को फ़ंक्शन पॉइंटर के माध्यम से स्वयं-संशोधित फ़ंक्शन को कॉल किया जाएगा और इसलिए स्वयं को संशोधित कोड के बारे में जानना या उसकी परवाह नहीं है और आपको केवल एक ही स्थान पर फ़िक्सअप करना होगा।

3

जैसा कि कार्ल कहते हैं, यह किया जा सकता है, लेकिन आप कीड़े का एक खोल खोल रहे हैं। व्यावहारिक रूप से, ऐसा करने वाले लोगों को अकादमिक या मैलवेयर लेखकों (अब मेरी लौ सबूत क्लोक) कर रहे हैं।

आप कुछ कोड को malloc'd ढेर क्षेत्र में कॉपी कर सकते हैं, फिर इसे फ़ंक्शन पॉइंटर्स के माध्यम से कॉल करें, लेकिन ओएस के आधार पर आपको सेगमेंट में निष्पादन सक्षम करना पड़ सकता है। आप कुछ कोड को कोड सेगमेंट में कॉपी करने का प्रयास कर सकते हैं (देखभाल करना निम्नलिखित फ़ंक्शन को ओवरराइट नहीं करना है), लेकिन ओएस ने इस सेगमेंट को केवल पढ़ने के लिए बनाया है। आप लिनक्स कर्नेल को देखना चाहेंगे और देखें कि यह इसके मॉड्यूल कैसे लोड करता है।

+1

+1 कुछ अच्छे अंक बताता है। लेखन/निष्पादन के लिए पृष्ठ मोड के बारे में: आप Win32 पर VirtualProtect के साथ फ्लाई पर और लिनक्स पर mprotect को बदल सकते हैं। और सभी पठनीय पृष्ठों को भी निष्पादन योग्य होना चाहिए क्योंकि हमारे पूर्वजों ने कुछ गलत समझा था – joveha

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

  • कोई संबंधित समस्या नहीं^_^