Когда программа на C ++ завершает работу в Windows, какова последняя функция, вызываемая заглушкой завершения? - PullRequest
7 голосов
/ 11 апреля 2011

Этот вопрос касается реверс-инжиниринга и стандартной библиотеки Microsoft C.

Когда программа на C корректно завершает свою работу, то есть return 0; в конце main().Что все происходит (обобщите, пожалуйста). В частности, что за функция last вызывается библиотекой C?

Ответы [ 2 ]

8 голосов
/ 11 апреля 2011

Источники Microsoft CRT можно найти в «% Program Files% \ Microsoft Visual Studio x.0 \ VC \ crt \ src».

Точка входа для исполняемых файлов (mainCRTStartup) находится в crt0.c или, в случае использования DLL времени выполнения, в crtexe.c. Вы можете видеть, что после вызова main() он вызывает exit(). Исходный код exit() находится в crt0dat.c. Он вызывает обработчики завершения C и C ++ (закрывающие дескрипторы stdio и т. Д.), Вызывает atexit() функции и, наконец, вызывает __crtExitProcess (), который вызывает ExitProcess () .

для kernel32.
2 голосов
/ 11 апреля 2011

Если у вас есть strace на вашем компьютере, вы можете использовать это (вызвать его через strace ./program) - на моем компьютере со следующим кодом, он дает exit_group(0) в качестве последней функции:

int main() {
    return 0;
}

Что касается того, что происходит (предупреждение: быстрое обобщение вперед), операционная система (теоретически) должна попытаться восстановить память из вашего процесса, удалив всю память, которую вы оставили новой.

...