免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: junenggai
打印 上一主题 下一主题

高手必看:程序出了main()入口外还有其它的吗 [复制链接]

论坛徽章:
0
1 [报告]
发表于 2007-10-12 16:00 |显示全部楼层
其实main只是你从应用程序源代码的角度看到的程序的入口。而在生成可以被某种OS识别的可执行档(PE or COFF or ELF)之前,linker会给这个文件加上一些附加的信息,其中就包括给main加一个wrapper. 而这个wrapper的第一条指令的地址,就叫做ENTRY,才是一个程序真正意义上的入口。wrapper的流程可以参考crt0.o的源代码。他在调用main之前会配置好堆栈,初始化BSS段,用atexit注册析构函数等等。

而ENTRY实际上在链接阶段才被指定,然后写入到生成的可执行档的某一个field当中(细节到具体哪个field可以去参考具体可执行档的Specification)。

在MS和GNU下可以利用链接器来修改默认的ENTRY。

MS: link /ENTRY:symbol (这个symbol可以在应用程序的源代码里指定)

GNU: ld  --entry ADDRESS (这个ADDRESS可以在应用程序的源代码里指定) 当然,也可以修改link script的ENTRY()来定制

所以要修改main()这个"入口",可以有很多方式,比如修改crt0.o, 用上述选项来bypass crt0.o 等等...

Any Problem, 欢迎讨论!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP