- 论坛徽章:
- 0
|
其实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, 欢迎讨论!!! |
|