In un programma C/C++ come funziona il sistema (windows, linux, mac OS X) chiamare la funzione main()

StackOverflow https://stackoverflow.com/questions/12332

  •  08-06-2019
  •  | 
  •  

Domanda

Sto cercando una spiegazione più tecnica e poi l'OS chiama la funzione.Qualcuno può aiutarmi o indicarmi un sito o un libro?

È stato utile?

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:

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top