2010-04-25 9 views
27

हाल ही में मैं कुछ निम्न स्तर के काम को डीबग करने का प्रयास कर रहा हूं और मुझे कंपाइलर (avr-gcc) के लिए crt0.S नहीं मिला, लेकिन मुझे एक crt1.S मिला (और इसी .o फाइलों के साथ ही)crt0.o और crt1.o - क्या अंतर है?

इन दो फ़ाइलों के बीच क्या अंतर है? क्या crt1 कुछ पूरी तरह से अलग है या क्या? दोनों को बूटस्ट्रैपिंग (स्टैक फ्रेम और इस तरह की स्थापना) के लिए कुछ करना पड़ता है, लेकिन भेद क्यों?

उत्तर

27

दोनों crt0/crt1 वही काम करते हैं, मूल रूप से मुख्य() (जैसे स्टैक प्रारंभ करना, इर्क सेटिंग इत्यादि) को कॉल करने से पहले आवश्यक है। आपको एक या दूसरे से लिंक करना चाहिए, लेकिन दोनों नहीं। वे वास्तव में पुस्तकालय नहीं हैं बल्कि वास्तव में इनलाइन असेंबली कोड हैं।

जहां तक ​​मैं समझता हूँ, CRT दो "जायके" में आता है

  • crt1 प्रणाली है कि निर्माणकर्ता और विनाशकर्ता (कार्यों से पहले और मुख्य और बाहर निकलने के बाद कहा जाता है) का समर्थन पर प्रयोग किया जाता है। इस मामले में मुख्य को सामान्य फंक्शन कॉल की तरह माना जाता है।
  • crt0 उन प्रणालियों पर उपयोग किया जाता है जो रचनाकारों/विनाशकों का समर्थन नहीं करते हैं।
+2

+1 http://lists.uclibc.org/pipermail/uclibc/2002- दिसम्बर/025943.html – stacker

+0

ये रचनाकार/विनाशक वास्तव में क्या हैं? क्या यह सी ++ या किसी चीज़ से संबंधित है? मेरे जवाब में यह 'crtbeginT.o' और' crtend.o' के बिना काम करता है जो कि कन्स्ट्रक्टर और विनाशक हैं। –

+0

मैंने इसे अपने उत्तर में लिखा था। यह सी ++ से संबंधित नहीं है (सीधे)। यह कार्य है जो मुख्य से पहले और कार्यक्रम के अंत के बाद बुलाया जाना चाहिए। यह ओएस से संबंधित है जिस पर प्रोग्राम चल रहा है। लेकिन मैं इस बारे में बताने वाला सबसे अच्छा व्यक्ति नहीं हूं (इस तरह के कार्यों को कभी नहीं लिखा, दूसरों ने इसे किया) और शायद यह इसके कुछ जवाब की योग्यता होगी। – kriss

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