En C/C++ programa de ¿cómo funciona el sistema (windows, linux, mac OS X) llamar a la función main()

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

  •  08-06-2019
  •  | 
  •  

Pregunta

Estoy en busca de una explicación más técnica, a continuación, el sistema operativo llama a la función.Alguien me puede ayudar o me apunte a un sitio web o un libro?

¿Fue útil?

Solución

El .archivo exe (o su equivalente en otras plataformas) contiene un "punto de entrada" de la dirección.En una primera aproximación, se carga el sistema operativo las secciones pertinentes de la .Archivo EXE en la ram, y luego salta al punto de entrada.

Como otros han dicho, este punto de entrada no se 'principal', pero en lugar de ser una parte de la biblioteca de tiempo de ejecución - que va a hacer cosas como la inicialización de objetos estáticos, la configuración de los argc/argv parámetros, la configuración de stdin/stdout/stderr, etc.Cuando se hace todo eso, que le llame a su función main ().Cuando las salidas principales, el tiempo de ejecución pasa a través de un otros análogos proceso de aprobación de su código de retorno al medio ambiente, llamando estática destructores, llamando _atexit rutinas, etc.

Si usted tiene MS de herramientas (tal vez no el regalo de promoción queridos), entonces usted tiene todo el tiempo de ejecución de la fuente, y una manera fácil de ver esto es para poner un punto de interrupción en la llave de cierre de su método main (), y de un solo paso atrás en el tiempo de ejecución.

Otros consejos

main() es parte de la biblioteca de C y no es una función del sistema.No sé para OS X o Linux, pero en Windows normalmente se inicia un programa con WinMainCRTStartup().Este símbolo init su proceso, extraer argumentos de línea de comandos y el medio ambiente (argc, argv, end) y las llamadas main().También es responsable de llamar a cualquier código que se debe ejecutar después de main(), como atexit().

Buscando en su archivo de Visual Studio, usted debería ser capaz de encontrar la implementación predeterminada de WinMainCRTStartup a ver qué hace.

También puede definir una función de su propia llamar al inicio, esto se hace cambiando "punto de entrada" en las opciones del enlazador.Esto es a menudo una función que no toma argumentos y devuelve un vacío.

En lo que a windows, el punto de entrada de las funciones son:

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

La única razón para usar estos más de la normal principal/WinMain/DllMain es si desea utilizar su propia biblioteca en tiempo de ejecución (Si desea que los archivos de menor tamaño o características personalizadas)

Para personalizar el tiempo de ejecución de las implementaciones y otros trucos para conseguir más pequeños PE archivos, consulte:

Experto en C++/CLI (revise alrededor de la página 279) tiene detalles muy específicos de los diferentes bootstrap escenarios para los nativos, mezclado, puro y asambleas CLR.

Se OS dependientes.En OS X, hay un marco en el mach encabezado que contiene la dirección de inicio de la EIP (puntero de instrucción) registrar.

Una vez que el binario está cargado, el sistema operativo inicia la ejecución de esta dirección:

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
[..]

La dirección es la dirección de la "función de inicio de los binarios:

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

En Mac OS X, que es el "inicio" de la función que se llama en primer lugar, incluso antes de que el "principal" de la función:

(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 ()

Si Usted está interesado en un libro relacionado con Windows y la API de Win32 intentar

"Programación de Aplicaciones para Microsoft Windows" por Jeffrey Richter.

Puedes echar un vistazo a los siguientes enlaces:

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top