windows运⾏⼀个.exe的过程
来⾃于《windows核⼼编程》
构建dll:
链接时,将<crtdll.c>(我本地在C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\crt\src)的 _DllMainCRTStartup 嵌⼊到dll映像中。
每当系统第⼀次将⼀个dll映射到进程地址空间或程序创建⼀个线程时,调⽤。
构建exe:
所有.obj 链接成.exe⽂件,其中包括所有⼆进制代码,全局、静态变量,各种段(如导⼊段,未初始化段)。
将运⾏库的启动函数嵌⼊exe。
1,运⾏.exe(双击,右键运⾏,命令⾏等)
操作系统为进程创建虚拟地址空间,并将.exe映射到基地址上,此时进程,主线程创建。
系统加载程序(估计是开机就启动的⼀个.exe)会检查.exe⽂件头(PE)。
⽂件头包含着⼀些exe级别的信息,构建exe时由链接器嵌⼊,⽐如“这是个控制台程序还是窗⼝程序”。
解析导⼊段,导⼊段包括所有需要的dll名称(不包括动态加载),dll函数地址,dll依赖的dll等。
2,操作系统调⽤C/C++运⾏库实现的运⾏时启动函数,⽐如wWinMainCRTStartup()。C/C++运⾏库安装VS都会有。
启动函数所做的事情:
一个线程可以包含多个进程
1)获取进程命令⾏指针
2)进程环境变量指针
3)初始化运⾏库的全局变量,包含stdlib.h就可以访问。⽐如unsigned int _osver; 操作系统的版本号,unsigned int __argv命令⾏参数数组等等。
4)初始化内存分配。malloc,堆等。
5)调⽤所有全局和静态C++类对象构造函数。
初始化之后,执⾏我们开发⼈员写的 main或者WinMain函数,然后⾛我们的代码。
⾛完之后,启动函数调⽤exit()函数,退出进程。
exit做的事情:
1)调⽤_onexit()执⾏注册的函数
2)C++析构
3)如果需要⽣成内存泄漏报告,就去⽣成
4)调操作系统ExitProcess()函数
给⼀个由VS2010向导创建的MFC单⽂档程序的调试过程:
1,按下F5,相当于双击了.exe。
系统创建进程,主线程,在<crtdll.c>中的_DllMainCRTStartup打断点,因为如果exe的导⼊段有程序
需要的dll,dll⼜写了DllMain函数,就会以DLL_PROCESS_ATTACH调⽤。通过hDllHandle参数的地址可以知道是哪个dll。
具体它做了什么事情,书上说是初始化了全局和静态变量及其它初始化⼯作。
2,所有dll加载完之后,调⽤运⾏库的启动函数。
在<crtexe.c>(我本地在C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\crt\src)的 mainret = WinMain(//...)打断点,然后就⾛到AfxWinMain了。
3,⾛⾃⼰的代码流程,消息循环等。如果你要关闭程序,先在<crtexe.c>的exit函数打断点,它就⾛这了。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。