首页
社区
课程
招聘
[讨论]mainCRTStartup调用的是我们定义的main吗?
发表于: 2018-2-16 21:47 4645

[讨论]mainCRTStartup调用的是我们定义的main吗?

2018-2-16 21:47
4645

最近看了《masm32开发包与VC6.0之间存在的Bug的体现及解决办法》,学的非常好,但我仍有个疑问

基本上所有的资料上都说,mainCRTStartup调用的是我们定义的main,但crt0.c源码中的main是三个参数的
int  __cdecl  main(int,  char  **,  char  **);                          /*generated  by  compiler*/

#ifdef  WPRFLAG
                        __winitenv  =  _wenviron;
                        mainret  =  wmain(__argc,  __wargv,  _wenviron);
#else    /*  WPRFLAG  */
                        __initenv  =  _environ;
                        mainret  =  main(__argc,  __argv,  _environ);
#endif    /*  WPRFLAG  */
但标准的是以下两个
int  main(void)
int  main(int  argc,  char  *agrv[])

VC下也可以使用三个参数的main

我的问题是crt0.obj中已经包含_main强符号(三个参数的main函数),我们提供的(无参数或两个参数)main函数也将产生_main强符号,这不会产生冲突吗
另外,看crt0.c代码,mainCRTStartup调用的是由编译器自动生成的带三个参数的main函数,而我们提供的(无参数或两个参数)main函数是由谁调用的呢

是这个编译器产生的三个参数是main调用了我们提供的符合标准的main吗?
如果是的话,但链接符号_main有两个,不会因重复导致冲突吗?



[招生]系统0day安全班,企业级设备固件漏洞挖掘,Linux平台漏洞挖掘!

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 23081
活跃值: (3447)
能力值: (RANK:648 )
在线值:
发帖
回帖
粉丝
2
是因为_main是c调用约定(cdecl),参数的平栈是由调用方来做的,也就是说标准是2个参数,但main的调用者是mainCRTStartup,它传了3个参数压进栈中给main用,main执行完之后mainCRTStartup又将这3个参数从栈中弹出,从而保证了栈的平衡。所以无论是没有参数、两个参数还是三个参数(甚至再增加参数)都是可以的,main都是一个,至于main函数在语法上要用几个参数就看main函数声明中的参数数量了。
2018-2-16 22:54
0
雪    币: 77
活跃值: (72)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
谢谢解答,这样是能解释通的
那么crt0.obj中包含的_main应该是弱符号(三个参数的main函数),我们提供的(无参数或两个参数)main函数将产生_main强符号,这样编译器链接时就不会产生冲突了。
2018-2-17 07:40
0
游客
登录 | 注册 方可回帖
返回
//