博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++反汇编学习笔记(三)
阅读量:5043 次
发布时间:2019-06-12

本文共 1140 字,大约阅读时间需要 3 分钟。

Chinese:

1、需要认识到main或者WinMain并不是真正的程序入口,它们也是函数,需要一个调用者。真正的入口一般为mainCRTStartup, wmainCRTStartup, WinMainCRTStartup或wWinMainCRTStartup,前两个是控制台环境下的多字节编码和Unicode编码的启动函数,后两个是Windows环境下多字节编码和Unicode编码的启动函数。

2、在启动函数中,有几个比较重要的默认启动函数

(1) GetVersion: 获取当前运行平台的版本号。

(2) _heap_init: 用于初始化堆空间。在函数实现中使用HeapCreate申请堆空间,申请空间的大小由_heap_init传递的参数决定。_sbh_heap_init函数用于初始化堆结构信息。

(3) GetCommandLineA: 获取命令行参数信息的首地址。

(4) _crtGetEnvironmentStringsA: 获取环境变量信息的首地址。

(5) _setargv: 根据GetCommandLineA获取命令行参数信息的首地址并进行参数分析,将分离出的参数的个数保存在全局变量_argc中,将分析出的每个命令行参数的首地址存放在数组中,并将这个字符指针数组的首地址保存在全局变量_argv中。

(6) _setenvp: 此函数根据_crtGetEnvironmentStringsA函数获取环境变量信息的首地址并进行分析,将得到的每条环境变量字符串的首地址存放在字符指针数组中,并将这个数组的首地址存放在全局变量env中。

(7) _cinit: 用于全局数据和浮点寄存器的初始化。全局对象和IO流等的初始化都是通过这个函数实现的。利用函数_initterm进行数据链初始化,这个函数由两个参数组成,类型为_PVFV *,这是一个函数指针数组,其中保留了每个初始化函数的地址。原型为:

typedef void (_cdec1 *_PVFV)(void);

C++规定全局对象和静态对象必须在main函数前构造,在main函数返回后析构。因此,这里的_PVFV函数指针数组就是用来代理调用构造函数的。

// _cinit函数代码片段// 用于初始化寄存器if (_FPinit != NULL)    (*_FPinit)();    //初始化浮点寄存器// 用于初始化C语法中的数据    _initterm(_xi_a, _xi_z);// 用于初始化C++语法中的数据    _initterm(_xc_a, _xc_z);

 

转载于:https://www.cnblogs.com/maplewan/p/3246001.html

你可能感兴趣的文章
第五周学习进度情况
查看>>
【旧文章搬运】Windbg+Vmware驱动调试入门(四)---VirtualKD内核调试加速工具
查看>>
Linux GDB Debugging
查看>>
代码智能提示
查看>>
Bootstrap 模态对话框只加载一次 remote 数据的解决办法
查看>>
SpringBoot源码解析:AOP思想以及相应的应用
查看>>
神的回帖
查看>>
3149 爱改名的小融 2
查看>>
20189208杨晨曦《移动平台开发实践》第9周学习总结
查看>>
UVa 11636 (注意读题) Hello World!
查看>>
find搜索文件系统,实时搜索
查看>>
【BZOJ3052】[wc2013]糖果公园 带修改的树上莫队
查看>>
Bootstrap 输入组
查看>>
hdu1003(简单dp)
查看>>
hdu3054(斐波那契。。。。找规律)
查看>>
个人博客02
查看>>
Winform架构
查看>>
深入浅出 React Native:使用 JavaScript 构建原生应用
查看>>
交换两个变量的值,不创建中间变量。求函数返回参数二进制中 1 的个数
查看>>
.Net开发笔记(八) 动态编译
查看>>