dumpbin发现没有入口函数_从零开始,学习windows编程 - 修改入口不为mainCRTStartup!...
发布日期:2021-06-24 11:28:14 浏览次数:2 分类:技术文章

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

84bfe0635af4ad97f2c54e0b49d05f0f.png

上次讲到,如果在VC的console程序中,入口不为mainCRTStartup,会出现什么后果?

我们就先将入口设置为main函数。

128689c0da57cfaf5fbb588ea11e8f06.png

先通过GUI来设置一下,创建一个win32 console Application。

872998c1f0152afe81b613f00f2a36a1.png

代码还是差不多,打印字符串;编译链接运行,当然没问题。

修改入口,在“project”->“setting”出现的对话框中,Link选项中,在“Entry-point symbol”中输入main。即定义好入口为main函数。

49da91b8fb08a2c6916adefd2f2cdc3f.png

Rebuild,编译链接,没有问题。

301b07aaa8b4c4df450d7b3995e70c1c.png

运行,出现问题 > > >

3a96111c069e60626238dd937dae90d0.png

来看一下到底是哪里出现了问题。运行debug版本,切到出错部分。VC界面为:

5d14265ba042563971aa1a27bd8de33c.png

不知道大家有没有看得清楚,我将call stack单独列在这里,也就是上图中标红线的部分。

0949221e8037237f85d210697e3d1e49.png

可以看到,出错部分是在NTDLL中的某个汇编代码中,但是根源是在printf,printf调用到这部分的时候,结果在_heap_alloc_base的时候出错了,_heap_alloc_base从字面意义上面就可以看出是在堆上分配内存的。

从上面一章,我们又可以得到mainCRTStartup函数在main函数之前调用,其中做了很多初始化工作,其中有一个函数调用叫做_heap_init,是用来创建和初始化CRT堆。而如果直接用main来做入口的话,则没有做这些init工作。

刚刚是通过GUI来创建的,而通过命令行,前面cl编译是一样的,link的时候使用

1e3b4351ed7d5a470b60d65c0e38fbe9.png

同样的效果。

另外,如果不用main,用另外一个函数,比如myentry,会出现什么情况呢?你可以先试试,后续来具体说明一下~

———————————————▁▂▃▅▆▇▉

我是一名从事了10年开发在退休边缘垂死挣扎的高龄程序员,最近我花了一些时间整理了一个完整的学习C语言、C++的路线,项目源码和工具。对于想学习C/C++的小伙伴而言,学习的氛围和志同道合的伙伴很重要,笔者推荐一个C语言/C++编程爱好者的聚集地~C/C++编程项目学习,素材笔记,项目源码等~

欢迎初学和进阶中的小伙伴。希望你也能凭自己的努力,成为下一个优秀的程序员。工作需要、感兴趣、为了入行、转行需要学习C/C++的伙伴可以一起学习!”

关注我,带你遨游代码世界!

下面这些是C/C++能做的 :

服务器开发工程师、人工智能、云计算工程师、信息安全(白客)、大数据 、数据平台、嵌入式工程师、流媒体服务器、数据控解、图像处理、音频视频开发工程师、游戏服务器、分布式系统、游戏辅助等!

转载地址:https://blog.csdn.net/weixin_32503531/article/details/112536381 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:管能做暖气管道吗_大家暖气片都是明装的吗?看看你家适合明装不
下一篇:技校毕业是什么学历_中等职业学校是什么_中等职业学校毕业是什么学历

发表评论

最新留言

感谢大佬
[***.8.128.20]2024年04月21日 03时36分25秒