Em um programa C/C++ como funciona o sistema (windows, linux, mac OS X) chamar a função main()
Pergunta
Eu estou procurando um mais explicação técnica, em seguida, o sistema operacional chama a função.Alguém pode me ajudar ou me aponte para um site ou livro?
Solução
A .exe ficheiro (ou o equivalente em outras plataformas) contém um 'ponto de entrada de endereços.Para uma primeira aproximação, o sistema operacional carrega as seções relevantes do .Arquivo EXE para a ram e, em seguida, salta para o ponto de entrada.
Como outros têm dito, este ponto de entrada não será 'principal', mas em vez de ser uma parte da biblioteca de tempo de execução - ele vai fazer coisas como iniciar objetos estáticos, configurando o argc/argv parâmetros, configuração de stdin/stdout/stderr, etc.Quando é feito tudo isso, ele irá chamar a sua função main ().Quando sai, o tempo de execução passa por um analagous processo de passar o seu código de retorno de volta para o ambiente, chamada de estática destruidores, chamando _atexit rotinas, etc.
Se você tiver ferramentas MS (talvez não o freebie), depois você tem todo o tempo de execução de origem, e uma fácil maneira de olhar para isso é colocar um ponto de interrupção no fechamento do seu método main (), e um único passo de volta para o tempo de execução.
Outras dicas
main()
é parte da biblioteca C e não é uma função do sistema.Eu não sei para OS X ou Linux, mas normalmente, o Windows inicia um programa com WinMainCRTStartup()
.Este símbolo init seu processo, extrair argumentos de linha de comando e meio ambiente (argc, argv, end
) e chamadas de main()
.É responsável, também, de chamar qualquer código que deve ser executado após main()
, como atexit()
.
Procurando no seu arquivo do Visual Studio, você deve ser capaz de encontrar a implementação do padrão de WinMainCRTStartup
para ver o que ele faz.
Você também pode definir uma função de chamada na inicialização, isto é feito alterando o "ponto de entrada" nas opções de vinculador.Isso é muitas vezes uma função que não requer argumentos e retorna um vazio.
Na medida do windows vai, o ponto de entrada funções são:
- Console:
void __cdecl mainCRTStartup( void ) {}
- GUI:
void __stdcall WinMainCRTStartup( void ) {}
- DLL:
BOOL __stdcall _DllMainCRTStartup(HINSTANCE hinstDLL,DWORD fdwReason,void* lpReserved) {}
A única razão para usar durante o normal principal/WinMain/DllMain é, se você queria usar a sua própria biblioteca de tempo de execução (Se você deseja tamanho de arquivo menor ou funcionalidades personalizadas)
Para tempo de execução personalizado implementações e outros truques para obter o menor PE arquivos, consulte:
Especialista em C++/CLI (verifique em torno de página 279) tem detalhes muito específicos das diferentes bootstrap cenários para o nativo, misto e puro CLR assembléias.
É dependente de sistema operacional.No OS X, há um quadro no mach cabeçalho que contém o endereço de início para o EIP (ponteiro de instrução) registrar.
Uma vez que o binário é carregado, o sistema operacional inicia a execução deste endereço:
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 [..]
O endereço é o endereço de "iniciar" a função do binário:
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
No Mac OS X, é o "start" função que é chamada pela primeira vez, mesmo antes de o "principal" função:
(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 Você está interessado em um livro relacionado com o Windows e a API do Win32 tentar
"A programação de Aplicações para o Microsoft Windows" por Jeffrey Richter.
Você pode dar uma olhada nas seguintes links: