एक सी/सी ++ प्रोग्राम में सिस्टम (विंडोज़, लिनक्स, मैक ओएस एक्स) मुख्य () फ़ंक्शन को कैसे कॉल करता है

मैं एक और तकनीकी स्पष्टीकरण की तलाश में हूं, ओएस फंक्शन को कॉल करता है। क्या कोई मेरी मदद कर सकता है या मुझे किसी वेबसाइट या पुस्तक पर इंगित कर सकता है?

0
ro fr bn
किसने मतदान किया? यह सवाल मेरे लिए बिल्कुल मान्य लगता है। यह अच्छा सवाल है !!!
जोड़ा लेखक Destructor, स्रोत

7 उत्तर

main() is part of the C library and is not a system function. I don't know for OS X or Linux, but Windows usually starts a program with WinMainCRTStartup(). This symbol init your process, extract command line arguments and environment (argc, argv, end) and calls main(). It is also responsible of calling any code that should run after main(), like atexit().

अपनी विजुअल स्टूडियो फ़ाइल को देखकर, आपको यह देखने के लिए WinMainCRTStartup का डिफ़ॉल्ट कार्यान्वयन करने में सक्षम होना चाहिए।

स्टार्टअप पर कॉल करने के लिए आप अपने आप के एक फ़ंक्शन को भी परिभाषित कर सकते हैं, यह लिंकर विकल्पों में "एंट्री पॉइंट" को बदलकर किया जाता है। यह प्रायः एक ऐसा कार्य होता है जो कोई तर्क नहीं लेता है और शून्य देता है।

0
जोड़ा

Expert C++/CLI (check around page 279) has very specific details of the different bootstrap scenarios for native, mixed, and pure CLR assemblies.

0
जोड़ा
0
जोड़ा

.exe फ़ाइल (या अन्य प्लेटफ़ॉर्म पर समतुल्य) में 'एंट्री पॉइंट' पता होता है। पहले अनुमान के लिए, ओएस .EXE फ़ाइल के प्रासंगिक खंड को रैम में लोड करता है, और उसके बाद एंट्री पॉइंट पर जाता है।

जैसा कि अन्य ने कहा है, यह प्रविष्टि बिंदु 'मुख्य' नहीं होगा, बल्कि इसके बजाय रनटाइम लाइब्रेरी का हिस्सा होगा - यह स्थिर वस्तुओं को प्रारंभ करने, argc/argv पैरामीटर सेट करने, stdin/stdout/stderr सेट करने जैसी चीजें करेगा , आदि। जब यह सब किया जाता है, तो यह आपके मुख्य() फ़ंक्शन को कॉल करेगा। जब मुख्य निकास होता है, तो रनटाइम पर्यावरण पर वापस अपने रिटर्न कोड को पास करने की एक समान प्रक्रिया के माध्यम से जाता है, स्थिर विनाशकों को बुलाता है, _atexit दिनचर्या आदि को बुलाता है।

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

0
जोड़ा

जहां तक ​​खिड़कियां जाती हैं, प्रवेश बिंदु फ़ंक्शन हैं:

  • Console: void __cdecl mainCRTStartup( void ) {}
  • GUI: void __stdcall WinMainCRTStartup( void ) {}
  • DLL: BOOL __stdcall _DllMainCRTStartup(HINSTANCE hinstDLL,DWORD fdwReason,void* lpReserved) {}

सामान्य मुख्य/WinMain/DllMain पर इनका उपयोग करने का एकमात्र कारण यह है कि यदि आप अपनी रन टाइम लाइब्रेरी का उपयोग करना चाहते हैं (यदि आप छोटे फ़ाइल आकार या कस्टम फीचर्स चाहते हैं)

कस्टम पीई फाइलों को पाने के लिए कस्टम रन टाइम कार्यान्वयन और अन्य चाल के लिए, देखें:

0
जोड़ा

यह ओएस निर्भर है। ओएस एक्स में, मच हेडर में एक फ्रेम है जिसमें ईआईपी (निर्देश सूचक) रजिस्टर के लिए प्रारंभ पता होता है।

एक बार बाइनरी लोड हो जाने पर, ओएस इस पते से निष्पादन शुरू करता है:

cristi:test diciu$ otool -l ./a.out | grep -A 10 LC_UNIXTHREAD
        cmd LC_UNIXTHREAD
    cmdsize 80
     flavor i386_THREAD_STATE
      count i386_THREAD_STATE_COUNT
[..]
        ss  0x00000000 eflags 0x00000000 eip 0x00001f8c cs  0x00000000
[..]

पता बाइनरी से "स्टार्ट" फ़ंक्शन का पता है:

cristi:test diciu$ nm ./a.out
0000200c D _NXArgc
00002008 D _NXArgv
00002000 D ___progname
00001fe0 t __dyld_func_lookup
00001000 A __mh_execute_header
[..]
00001f8c T start

मैक ओएस एक्स में, यह "प्रारंभ" फ़ंक्शन है जिसे "मुख्य" फ़ंक्शन से पहले भी पहले कहा जाता है:

(gdb) b start
Breakpoint 1 at 0x1f90
(gdb) b main
Breakpoint 2 at 0x1ff4
(gdb) r
Starting program: /Users/diciu/Programming/test/a.out 
Reading symbols for shared libraries ++. done

Breakpoint 1, 0x00001f90 in start ()
0
जोड़ा

यदि आप विंडोज और विन 32 एपीआई से संबंधित पुस्तक में रुचि रखते हैं तो कोशिश करें

जेफरी रिचटर द्वारा "माइक्रोसॉफ्ट विंडोज के लिए प्रोग्रामिंग एप्लीकेशन"।

0
जोड़ा