2016-08-24 5 views
11

मैं थोड़ा अधिक गहराई में सी संकलन को समझने की कोशिश कर रहा हूं, और इसलिए मैं संकलित और "मैन्युअल" लिंक कर रहा हूं। यहाँ मेरी कोडन्यूनतम सी प्रोग्राम में "मुख्य" के लिए अनिर्धारित संदर्भ

int main() 
{ 
    return 0; 
} 

और यहाँ है कि मैं क्या मेरे कंसोल (विंडोज़) में डाल कर रहा हूँ है:

gcc -S main.c 
as main.s -o main.o 
ld main.o 

और जब लिंक करने का प्रयास, मैं मिलता है:

main.o:main.c:(text+0x7): undefined reference to `__main' 
+2

यह देखने के लिए कि 'कंपाइलर वास्तव में क्या आदेश देता है,' gcc -v main.c' चलाएं। ध्यान दें कि यह आपके द्वारा दिए गए की तुलना में 'ld' के लिए एक बहुत अधिक जटिल कमांड लाइन चलाता है। –

+0

जीसीसी के चरम लंबे 'एलडी' तर्क हमेशा अनिवार्य नहीं होते हैं। एक सरल 'हैलो, वर्ल्ड' प्रोग्राम केवल पूरी तरह से जुड़ा जा सकता है: 'ld -lc -lkernel32 src.o -o src.exe'। –

+0

@RyanB मुझे "-lc नहीं मिल सकता"। –

उत्तर

12

आप किसी भी आवश्यक समर्थन पुस्तकालयों को लिंक नहीं किया। सी वैश्विक वस्तुओं जैसे stdin, stdout, stderr सिर्फ कहीं से नहीं दिखाई देते हैं। कमांड तर्क और पर्यावरण चर ऑपरेटिंग सिस्टम से खींचे जाते हैं। और बाहर निकलने पर उन सभी atexit() कार्यों को कॉल किया जाता है और main से वापसी कोड exit(return_code) पर भेज दिया जाता है। आदि

gcc -dumpspecs, gcc -print-libgcc-file-name आदेशों को देखें। उस निर्देशिका में अन्य सभी पुस्तकालयों को देखो। आपको उन पुस्तकालयों और ऑब्जेक्ट फ़ाइलों को डंपस्पेक्स के आउटपुट में संदर्भित किया जाएगा। मुझे नहीं पता कि उन spec नियमों का अर्थ कब या कैसे किया जाता है लेकिन आप शायद विचार प्राप्त कर सकते हैं। और मुझे लगता है कि जीसीसी जानकारी पेज info gcc विस्तार से समझाते हैं यदि आप काफी दूर तक खोदते हैं।

info gcc और उसके बाद 'जी' दबाएं और फिर enter 'युक्ति फ़ाइलें'

और के रूप में जोनाथन Leffler ने कहा, शॉर्टकट वर्बोज़ विकल्प के साथ जीसीसी को चलाने के लिए है: gcc -v और बस क्या आज्ञा देता है यह प्रयोग किया जाता है देखते हैं।

+0

लेकिन यदि समस्या पुस्तकालयों का समर्थन करती है, तो "__main" के अनिर्धारित संदर्भ क्यों हैं? –

+0

@JackM वह फ़ंक्शन है जो 'मुख्य' में वास्तविक कार्य करता है, उदाहरण के लिए: https://gcc.gnu.org/onlinedocs/gccint/Collect2.html – deamentiaemundi

+0

इसके अलावा, यदि आप एएसएम में खोदना चाहते हैं, तो अच्छा अभ्यास ऑप्टिमाइज़ेशन को बंद करना होगा (-O0 ध्वज)। यहां बेकार है क्योंकि कोई भी कार्य और कोई अनुकूलन किया जाना है, लेकिन मुझे लगता है कि यह इंगित करने योग्य है। –

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