अगर मैं यह पता लगाने कैसे संकलक यह पार्स, मैं इस अपडेट कर देंगे, लेकिन कम से कम वहाँ उन्हें कैसे कंपाइल करने के लिए के रूप में कोई अटकलबाजी होने की जरूरत है:
objdump --disassemble /tmp/hello (edited):
080483c4 <main>:
80483c4: 55 push %ebp
80483c5: 89 e5 mov %esp,%ebp
80483c7: 83 e4 f0 and $0xfffffff0,%esp
80483ca: 83 ec 10 sub $0x10,%esp
80483cd: b8 a0 84 04 08 mov $0x80484a0,%eax
80483d2: 89 04 24 mov %eax,(%esp)
80483d5: e8 22 ff ff ff call 80482fc <[email protected]>
80483da: c9 leave
80483db: c3 ret
80483dc: 90 nop
80483dd: 90 nop
80483de: 90 nop
80483df: 90 nop
लिनक्स निष्पादनयोग्य के बाद से 0x8048000 पर सामान्य रूप से आधारित हैं , printf के लिए तर्क का पता एक द्विआधारी की शुरुआत से 0x00004a0 की भरपाई पर है:
xxd /tmp/hello | grep 00004a0
00004a0: 4865 6c6c 6f2c 2077 6f72 6c64 210a 0000 Hello, world!...
तो, तार का पता धकेल दिया जाता है, और printf कि एक आर्ग के साथ कहा जाता है। उस स्तर पर जादुई कुछ भी नहीं, इसलिए सभी मजेदार सामान जीसीसी द्वारा किया गया था।
स्रोत
2010-11-11 04:41:52
'printf' पर कॉल निश्चित रूप से किसी भी पूर्व-' मेन 'स्टार्टअप कोड में नहीं जाता है। –
@ आर ..: यह सिर्फ एक अनुमान था, और सबसे अच्छा मैं कर सकता हूं। यह संभवतः कहां निष्पादित किया जा सकता है? – casablanca
@ आर ..: कोई बात नहीं, आप इसके बारे में सही हैं और मैंने अपने स्वयं के प्रश्न का उत्तर दिया। :) – casablanca