关于不同的程序入口,main(), _tmain(),WinMain(),wmain()?

本文探讨了不同程序入口如main(), _tmain(), WinMain(), wmain()的用法和背后的原理。在Windows环境下,编译器和链接器会根据程序类型选择合适的入口点,例如使用/SUBSYSTEM:CONSOLE对应mainCRTStartup,而/SUBSYSTEM:WINDOWS则对应WinMainCRTStartup。这些入口点函数负责初始化运行时库,调用全局对象的构造函数等任务。默认情况下,不应轻易更改入口点,以免增加额外的初始化工作。文章还介绍了加载器如何与链接器协同工作,确保程序正确执行。" 128111226,12569110,Linux操作与配置实践指南,"['Linux操作系统', 'Docker容器', '系统管理', 'Shell脚本', '编程']
摘要由CSDN通过智能技术生成
今天终于有时间来研究一下一个很大很大的工程编译成一个exe和若干dll后,程序是如果执行它的第一条指令的?操作系统以什么规则来找到应该执行的第一条指令(或说如何找到第一个入口函数的)?

   我们以前写windows程序时,都是先写个main()函数,然后再写自己的逻辑,然后编译,然后点击exe就能运行我们的程序了;如果我们用VS2005工具生成一个非空工程,工程会为我们提供一个int_tmain(int argc, _TCHAR*argv[])或WinMain()函数的入口,然后我们在里面添加程序等等。我们上学时这是这样做了,但是很多人这时理所当然的,很少人会去问为什么会这样?

   我读了MSDN里面的讲解才弄出点眉目了,其实我们以前所写的以main()函数开始的程序都是一个半成品,剩下的也是与系统息息相关的工作由编译器帮我们代劳了。怎么回事呢?编译器是如何帮我们代劳的呢?那么程序被系统加载时,准确的说是被系统中的加载器加载时又是如何知道编译器在我们写的程序上做了手脚呢?难道编译器和加载器之间有什么协定吗?这一些列的问题,做为刚入行的你是否在心里问过自己没有!?

   我们以前写的程序在编译器编译成为一个模块(可能是obj文件或其他形式),然后链接器会将一些所需要的库文件和刚才编译器生成的文件进行链接,最终生成一个exe文件,在所链接的库文件中就包含CRT运行时库,这就是我们今天谈论的主角。在运行时库里面有好一个已经定义如下的函数函数:

(1)mainCRTStartup(或wmainCRTStartup)       //使用/SUBSYSTEM:CONSOLE 的应用程序

(2)WinMainCRTStartup(或 wWinMainCRTStartup) //使用/SUBSYSTEM:WINDOWS 的应用程序

(3)_DllMainCRTStartup   <

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值