2012-02-11 18 views
8

मैं जानता हूँ कि यह एक बहुत ही बुनियादी सवाल यह है कि लेकिन जब मैं जीसीसी के साथ अपने C/C++ कोड संकलन/जी ++ वास्तव में मध्यवर्ती उत्पादन के प्रकार है कि क्या इससे पहले कि कोडांतरक मशीन कोड उत्पन्न करने के लिए खेलने में आता है? क्या यह X86 निर्देशों की तरह कुछ है?जीसीसी/जी ++ उत्पादन प्रकार

+2

क्या _intermediate_ आउटपुट का मतलब है? 'g ++' सीधे असेंबली उत्पन्न करता है। – Lol4t0

+0

निम्नलिखित विकल्प उपयोगी हो सकते हैं: '-g -Wa, -ahl = main.s'। वे जीसीसी/जी ++ को असीमित उच्च स्तरीय स्रोत कोड के साथ असेंबली उत्सर्जित करने का कारण बनते हैं। –

+0

यह एक बुनियादी सवाल नहीं है। – cha0site

उत्तर

12

जीसीसी के संसाधन श्रृंखला इस प्रकार है:

  • अपने स्रोत कोड

  • preprocessed स्रोत कोड (मैक्रोज़ का विस्तार करें और इसमें शामिल हैं, स्ट्रिप टिप्पणियां) (-E, .ii)

  • असेंबली के लिए संकलित (-S, .s)

  • बाइनरी में इकट्ठा (-c, .o)

  • लिंक प्रत्येक स्तर पर

एक्ज़िक्यूटेबल में मैं प्रासंगिक संकलक झंडे कि इस प्रक्रिया यहीं समाप्त कर सूचीबद्ध किया है , साथ ही संबंधित फ़ाइल प्रत्यय।

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

"संकलन" मंच उचित वास्तविक भार उठाने हिस्सा है। पूर्वप्रक्रमक अनिवार्य रूप से एक अलग, स्वतंत्र उपकरण (हालांकि अपने व्यवहार C और C++ मानकों के द्वारा अनिवार्य है), और कोडांतरक और लिंकर acutally अलग, बिना आधार के उपकरण है कि मूल रूप से बस को लागू करने, क्रमशः, हार्डवेयर के द्विआधारी अनुदेश प्रारूप और कर रहे हैं ऑपरेटिंग सिस्टम के लोड करने योग्य निष्पादन योग्य प्रारूप।

+0

+1, उत्कृष्ट उत्तर। आप असेंबली के बारे में एक अस्पष्टता जोड़ना चाहेंगे, क्योंकि ऐसा लगता है कि पूछताछ उस पर बिल्कुल स्पष्ट नहीं है। – cha0site

+0

@ cha0site: धन्यवाद ... चलो देखते हैं; स्पष्टीकरण मांगने के लिए ओपी का स्वागत है, इस मामले में मुझे विस्तार करने में खुशी होगी। –

+0

@KerrekSB विस्तृत उत्तर के लिए बहुत बहुत धन्यवाद, मुझे लगता है कि मुझे अब यह मिल गया है। नीचे ज़राकी केनपची द्वारा उत्तर भी बहुत उपयोगी था। तो मुझे लगता है कि असेंबली उत्पन्न करने से पहले जीसीसी को मेरे हार्डवेयर के बारे में जानकारी मिलती है या प्रत्येक प्रकार के हार्डवेयर के लिए एक अलग कंपाइलर है? – Cemre

0

यह विधानसभा कोड होना चाहिए। आप इसे संकलन के लिए कमांड लाइन में -S ध्वज का उपयोग करके प्राप्त कर सकते हैं।

0

कोई "मध्यवर्ती उत्पादन" है। आपको प्राप्त होने वाला पहला आउटपुट मशीन कोड है। (आप केवल पूर्वप्रक्रमक लागू -E साथ द्वारा C/C मध्यवर्ती उत्पादन प्राप्त कर सकते हैं हालांकि ++।)

4

तो, जीसीसी में निष्पादन के संकलन 4 हिस्से होते हैं:

1.) Preprocessing (जीसीसी -E main.c> main.i, * ग * मैं) करता है विस्तार, शामिल करने के लिए बदल मार्को प्रक्रिया करता है। टिप्पणियां हटाता है।

2.) संकलन (gcc -S main.i; * .i से * .s, यदि सफल हो तो बदलता है) असेंबलर को सी-कोड संकलित करता है (लक्ष्य x86 आर्किटेक्चर पर यह x86-assembly है, लक्ष्य x86_64 आर्किटेक्चर पर यह लक्ष्य हाथ आर्किटेक्चर पर x64-assembly है, यह आर्म असेंबली है, आदि) अधिकांश भाग चेतावनी और त्रुटियां इस भाग के दौरान होती हैं (उदाहरण के लिए त्रुटि और चेतावनी रिपोर्टिंग)

3.) असेंबली (main.s के रूप में - o main.o; * .i से * .o में परिवर्तन करता है, फिर सफल होने पर) असेंबली असेंबलर को मशीन कोड में उत्पन्न करता है। यद्यपि अभी भी प्रक्रियाओं के सापेक्ष पते हैं, और ऐसे।

4.) को लिंक (जीसीसी मुख्य।ओ) पूर्ण पते के साथ सापेक्ष पते बदलता है। बेकार पाठ हटा देता है। इस चरण के दौरान त्रुटियों और चेतावनियों को जोड़ना। और अंत में (यदि सफल हो), तो हमें निष्पादन योग्य फ़ाइल मिलती है।

तो, अपने प्रश्न का उत्तर देने के लिए, मध्यवर्ती आउटपुट का मतलब वास्तव में असेंबली भाषा कहा जाता है - उस Assembly language wiki के बारे में विकी देखें।

+0

विस्तृत उत्तर के लिए बहुत बहुत धन्यवाद। यह बहुत उपयोगी था। – Cemre

+0

चरण 3 पढ़ना चाहिए "... * .s से * .o" बदलता है? – nickgrim

0

जीसीसी उपकरण श्रृंखला, प्रोग्राम को स्रोत कोड से मशीन कोड तक संकलित करता है। कंपाइलर असेंबली कोड उत्पन्न करता है जो असेंबलर मशीन कोड में इकट्ठा होता है। Here शुरुआती लोगों के लिए एक अच्छा ट्यूटोरियल है।

2

यहाँ redhat magazine के सौजन्य से जीसीसी संकलन कदम की एक ग्राफिक प्रतिनिधित्व है:

gcc compilation steps

विपरीत करने के लिए अन्य क्या जवाब मतलब है, वहाँ कोई विधानसभा कदम है - बल्कि, कोडांतरक कोड जनरेट वस्तु कोड पीढ़ी की जगह; यदि आप वास्तव में चाहते हैं कि एक बाइनरी प्रतिनिधित्व है तो यह एक पाठ में एक इन-मेमोरी प्रस्तुति को रूपांतरित करने के लिए अधिक समझ में नहीं आता है।

+0

खैर, हाँ, यह मनोविज्ञान उत्पन्न करने के लिए बहुत अधिक समझ में नहीं आता है, जो मानव के पढ़ने के लिए हैं, यदि आप वैसे भी ऑब्जेक्ट कोड बनाने जा रहे हैं। लेकिन निमोनिक्स ऑब्जेक्ट कोड के साथ लगभग 1: 1 हैं, और असेंबलर _is_ के कोड जनरेशन भाग (जंप पते की गणना, उस तरह की चीज की गणना)। – cha0site

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