2012-01-09 8 views
7

मैं उस पुस्तकालय के भीतर निष्पादन योग्य कोड को गतिशील रूप से बदलने में सक्षम होना चाहता हूं जिसका उपयोग मैं कर रहा हूं। अनिवार्य रूप से, यदि आवश्यक नहीं है तो मैं कुछ कार्यों को गतिशील रूप से एनओपी करना चाहता हूं।मैं जीसीसी को ईएलएफ बाइनरी में लिखने योग्य के रूप में .text अनुभाग को संकलित कैसे कर सकता हूं?

हालांकि, लाइब्रेरी का .text अनुभाग मैं उपयोग नहीं कर रहा हूं (जैसा कि अधिकांश कार्यक्रमों के मामले में है)। मेरे पास लाइब्रेरी का स्रोत कोड है और इसलिए इसे जीसीसी का उपयोग लिखने के लिए संकलित करने के लिए करना होगा।

क्या ऐसा करने का कोई तरीका है?

+0

ऐसा करने के लिए व्यावहारिक कारण क्या है के साथ जीसीसी के पास हो सकता है के साथ लिंक करने के लिए है? – cateof

उत्तर

1

शायद सबसे अच्छा तरीका सिस्टम विशिष्ट एपीआई का उपयोग उस स्मृति की उत्तरदायित्व को बदलने के लिए करना है जिसे आप संशोधित करना चाहते हैं, इसे संशोधित करें, फिर इसे वापस बदलें।

यूनिक्स परिवार सिस्टम पर, आप mprotect पर देखना चाहते हैं। बस ध्यान रखें कि यह उन ब्लॉकों से संबंधित है जो आपके सिस्टम के पृष्ठ आकार के गुणक हैं। शायद 40 9 6, इसलिए गोल करने की संभावना है।

+0

वैसे मैं जेनोड ऑपरेटिंग सिस्टम के साथ काम कर रहा हूं और गतिशील लिंकर के map_object() फ़ंक्शन को फिर से लिखने की कोशिश कर रहा हूं। Mprotect() लागू होगा कि कार्यक्रम के लोडिंग चरणों में जल्दी? – samoz

5

संकलित पुस्तकालय पर objcopy --writable-text आज़माएं, दस्तावेज के अनुसार इसे .text लिखने योग्य बनाना चाहिए।

+1

क्या यह कोई प्रश्न या उत्तर है? –

7

सामान्य अर्थ में, mprotectsys/mman.h के तहत पसंदीदा विकल्प (POSIX अनुरूप प्रणाली पर) है (http://linux.die.net/man/2/mprotect देखें)। बस अनुमति प्रक्रिया का अनुरोध करने के लिए अपनी प्रक्रिया के निष्पादन योग्य अनुभाग का पता और सिस्टम पेज गिनती प्राप्त करें और mprotect पर कॉल करें; इसे लिखो; फिर, लिखने की अनुमति जारी करने के लिए फिर से mprotect पर कॉल करें।

हालांकि, अगर यह जहां गति पूर्ण महत्व का है निम्न स्तर के दिनचर्या पर करने के लिए है (या mprotect नहीं उपलब्ध है) तो आप mprotect सबसे अधिक संभावना मुद्दों बुला के रूप में अपनी .text खंड लिखने योग्य के साथ पुस्तकालय संकलित करने के लिए चाहता हूँ एक अनुवाद लुकसाइड बफर (टीएलबी) फ्लश है कि (विशेष रूप से एक बहु-प्रोसेसर पर्यावरण में) एक बाधा उत्पन्न कर सकता है। यदि विशिष्ट प्रणाली पेजिंग के माध्यम से हार्डवेयर सुरक्षा का उपयोग कर रही है (जो लगभग सभी अब हैं) तो सुरक्षा को बदलने का एकमात्र तरीका एक टीएलबी फ्लश कर रहा है जिसे प्रत्येक संदर्भित पृष्ठ पर निष्पादित किया जाना चाहिए, संदर्भित पृष्ठ तालिका (पृष्ठों का समूह), संदर्भित पृष्ठ निर्देशिका (पृष्ठ सारणी का समूह) और प्रत्येक प्रोसेसर। इसे ऊपर करने के लिए, इसे रिंग 0 में निष्पादित किया जाना चाहिए जिसके लिए एक सिस्कल की आवश्यकता होती है जो चेरी को ऊपरी हिस्से में ऊपर रखती है।

बाद के मामले में, सबसे आसान समाधान लाइब्रेरी को सामान्य रूप से संकलित करना होगा और फिर objcopy इसे --writable-text (जैसा कि ggiroux द्वारा उल्लिखित) के साथ होगा।

एक और समाधान लिंकर मानचित्र फ़ाइल linker.ld स्वयं को परिभाषित करना होगा। फिर आप स्पष्ट रूप से किसी भी खंड की अनुमतियां निर्दिष्ट कर सकते हैं। यह बहुत जटिल नहीं है; अगर सिस्टम-निर्भर है। http://www.math.utah.edu/docs/info/ld_3.html पर प्रलेखन का संदर्भ लें। आप अपने सिस्टम को linker.ld फ़ाइल प्रदान कर सकते हैं और इसे वहां से संशोधित कर सकते हैं। जीसीसी में -Wl,--verbose पास करने से लिंकर को सभी प्रासंगिक फाइलों (इसके डिफ़ॉल्ट लिंकर.एलडी सहित) को थूकने का निर्देश दिया जाएगा जिसमें आप .text अनुभाग की अनुमतियों को संशोधित कर सकते हैं और नई linker.ld फ़ाइल का उपयोग करके लाइब्रेरी (हमेशा के लिए) को पुन: संकलित कर सकते हैं।

संक्षेप में, मेरी सिफारिश अंतिम पैराग्राफ राज्यों के रूप में करना होगा और अपनी लाइब्रेरी को थोड़ा संशोधित लिंकर स्क्रिप्ट के साथ संकलित करना होगा।

2

सबसे आसान तरीका मैं (binutils 2.22) पाया एन कि जीसीसी -XN

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

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