Em um programa C/C++ como funciona o sistema (windows, linux, mac OS X) chamar a função main()

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

  •  08-06-2019
  •  | 
  •  

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?

Foi útil?

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:

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top