In un programma C/C++ come funziona il sistema (windows, linux, mac OS X) chiamare la funzione main()
Domanda
Sto cercando una spiegazione più tecnica e poi l'OS chiama la funzione.Qualcuno può aiutarmi o indicarmi un sito o un libro?
Soluzione
L' .i file exe (o equivalente su altre piattaforme) contiene un "punto di ingresso" indirizzo.In prima approssimazione, il caricamento del sistema operativo sezioni pertinenti della .EXE file in ram, e poi passa per il punto di ingresso.
Come altri hanno detto, il punto di ingresso non sara 'principale', ma invece di essere una parte della libreria di runtime - è fare le cose come inizializzazione di oggetti statici, impostazione del argc/argv parametri di impostazione stdin/stdout/stderr, etc.Quando è fatto tutto ciò, verrà chiamare la funzione main ().Quando esce, il runtime passa attraverso un analogo processo di passaggio codice di ritorno indietro per l'ambiente, la chiamata statica distruttori, chiamando _atexit routine, etc.
Se si dispone di MS strumenti (forse non il freebie quelli), poi ci sono tutte le runtime di origine, e un modo semplice per guardare si tratta di mettere un punto di interruzione sulla parentesi graffa di chiusura di il metodo main (), e l'unico passo indietro in fase di runtime.
Altri suggerimenti
main()
fa parte della libreria C e non è una funzione di sistema.Non so per OS X o Linux, ma Windows di solito inizia un programma con WinMainCRTStartup()
.Questo simbolo init il processo, estratto di argomenti della riga di comando e l'ambienteargc, argv, end
) e chiamate main()
.È anche responsabile della chiamata di un codice che deve essere eseguito dopo main()
, come atexit()
.
Cercando nel vostro file di Visual Studio, si dovrebbe essere in grado di trovare l'implementazione di default di WinMainCRTStartup
per vedere che cosa fa.
È inoltre possibile definire una funzione da chiamare all'avvio, questo viene fatto modificando "punto di ingresso" nelle opzioni del linker.Questo è spesso una funzione che non accetta argomenti e restituisce un void.
Visto da windows come va, il punto di ingresso di funzioni sono:
- Console:
void __cdecl mainCRTStartup( void ) {}
- GUI:
void __stdcall WinMainCRTStartup( void ) {}
- DLL:
BOOL __stdcall _DllMainCRTStartup(HINSTANCE hinstDLL,DWORD fdwReason,void* lpReserved) {}
L'unico motivo per utilizzare questi oltre la normale principale/WinMain/DllMain è se si desidera utilizzare la vostra propria libreria di runtime (Se volete file di piccole dimensioni o caratteristiche personalizzate)
Per l'esecuzione personalizzate implementazioni e altri trucchi per ottenere più piccoli PE file, vedere:
Esperto di C++/CLI (controllare intorno a pagina 279) ha dettagli molto specifici delle diverse bootstrap scenari per i nativi, misti, puro assembly CLR.
È OS dipendente.In OS X, c'è una cornice in mach di intestazione che contiene l'indirizzo di partenza per il PEI (instruction pointer) registro.
Una volta che il binario è caricato, il sistema operativo lancia esecuzione da questo indirizzo:
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 [..]
L'indirizzo è l'indirizzo di "start" sul binario:
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
In Mac OS X, è la "start" funzione che viene chiamata prima, anche prima della funzione "main":
(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 ()
Se Siete interessati a un libro relativo a Windows e le API Win32 provare
"La programmazione di Applicazioni per Microsoft Windows" di Jeffrey Richter.
Potete dare un'occhiata ai seguenti link: