2010-09-01 10 views
14

मैं एक ऐसी फाइल तैयार करना चाहता हूं जिसे मैं स्मृति में लोड कर सकता हूं (उदाहरण के लिए mmap के साथ) और फिर कोड चलाने के लिए उस स्मृति की शुरुआत पर कूदें।जीसीसी को केवल मशीन कोड कैसे उत्पन्न करें जिसे सीधे मेमोरी में लोड किया जा सकता है और निष्पादित किया जा सकता है?

आदर्श रूप से, मुझे या तो कोड को स्थानांतरित करने योग्य (जो अक्षम हो सकता है) या एक स्पष्ट पता निर्दिष्ट करना है कि कोड को लोड होने की उम्मीद है (जो दर्द है), लेकिन कोई भी शायद काम करेगा अपने आप ठीक है।

+0

यह कोई ऑब्जेक्ट फ़ाइल नहीं है? – aaronasterling

+1

नहीं, कम से कम, ऑब्जेक्ट फ़ाइलों में वे कौन से प्रतीक निर्यात करते हैं (लिंकर द्वारा उपयोग के लिए) –

+2

कोई विशिष्ट कारण है कि आप इसके बजाय एक डीएल/साझा लाइब्रेरी का उपयोग नहीं करना चाहते हैं? कच्चे बाइनरी के साथ नुकसान का एक * बहुत * है। – snemarch

उत्तर

14

आप यह कर सकते हैं लेकिन आपको ऑब्जेक्ट फ़ाइल स्वरूप से गुज़रना होगा। विशेष रूप से, objcopy कमांड निष्पादन योग्य फ़ाइल को "फ्लैट" बाइनरी फ़ाइल (आपके लक्षित प्लेटफॉर्म के आधार पर) में बदल सकता है। शायद इस तरह कुछ:

gcc -o test test.c 
objcopy -O binary test test.bin 

अधिक जानकारी के लिए अपने मंच पर man objcopy देखें।

+0

+1, मुझे पता था कि ऐसा कुछ था ।क्या आप जानते हैं कि मुझे इसे किसी विशिष्ट पते पर लोड करने की आवश्यकता है या नहीं? –

+0

हां आप करेंगे। यह वह पता होगा जो लिंकर को लिंक करने के लिए कहा गया था। ध्यान दें कि आप आमतौर पर लिंकर की नियंत्रण फ़ाइल नहीं देखते हैं, इसलिए आपको पता नहीं हो सकता कि यह कहां है .... – RBerteig

+0

मुझे नियंत्रण फ़ाइल कहां मिलेगी? –

6

आप उपयोगिता objcopy के बारे में जानना चाहते हैं, जो आमतौर पर जीसीसी के साथ उपलब्ध होता है। यह उपकरण के binutils पैकेज का एक घटक है, जिसमें से सबसे दृश्यमान सदस्य लिंकर है, ld

प्रक्रिया यह है कि आप अपनी स्रोत फ़ाइल संकलित करते हैं और उन्हें सामान्य रूप से सामान्य रूप से लिंक करते हैं। यह आपको एल्फ (या एक अन्य स्थानापन्न प्लेटफार्म-निर्भर बाइनरी) प्रारूप में एक निष्पादन योग्य निष्पादन योग्य बनाता है। फिर आप निष्पादन योग्य को एक फ्लैट बाइनरी छवि में बदलने के लिए objcopy का उपयोग करें।

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

यदि आपका लक्ष्य किसी ऐसी प्रक्रिया को प्राप्त करना है जो किसी .so फ़ाइल की तरह है, तो मौजूदा प्रक्रिया में लोड किया जाना चाहिए, तो ध्यान रखें कि साझा लाइब्रेरी लोडर के कुछ काम वास्तव में लिंकिंग को समाप्त करना है ताकि प्रतीक .so फ़ाइल में जो मुख्य निष्पादन योग्य (या अन्य .so फ़ाइलों) में पते का संदर्भ लेता है, लोड समय पर हल हो जाता है। Objcopy का उपयोग करना ऐसा नहीं करेगा, और इसलिए आपके मौजूदा सी रनटाइम लाइब्रेरी और ऑब्जेक्ट्स को सही तरीके से उपयोग करने के लिए इस तरह से लोड किए गए फ़ंक्शंस के लिए मुश्किल हो सकती है।

अपने लक्ष्यों के बावजूद, आपको किसी ज्ञात पते पर अपनी बाइनरी का पता लगाने के लिए लिंकर के नियंत्रण को जब्त करने की आवश्यकता होगी। ऐसा करने के लिए, आपको एक लिंकर स्क्रिप्ट तैयार करने की आवश्यकता होगी। स्क्रिप्ट भाषा के लिए प्रलेखन the binutils manual में है। यदि आप किसी प्रारंभिक वैश्विक चर के लिए योजना बनाते हैं तो आप मुख्य रूप से ".text *" खंडों में और संभवतः ".rodata *" खंडों में रुचि रखते हैं। असल में उस प्रारंभिक व्यवस्था की व्यवस्था पाठक के लिए एक अभ्यास के रूप में छोड़ दी गई है।

कुल मिलाकर, यह सिर्फ एक बहुत बड़े हिमशैल की नोक है। मैं एक क्रॉस कंपाइलर निर्माण के साथ कुछ समय बिताने का सुझाव देता हूं कि यह देखने के लिए कि इन चीजों का अभ्यास कैसे किया जाता है। एवीआर और एमएसपी 430 समुदाय जीसीसी का उपयोग करते हैं, सक्रिय भागीदारी करते हैं, और सस्ती (और अक्सर ओपन सोर्स) हार्डवेयर शुरू करने के लिए करते हैं।

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

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