En C/C++ programa de ¿cómo funciona el sistema (windows, linux, mac OS X) llamar a la función main()
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?
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: