从上学开始学C语言,就知道写程序要有个入口,就是main()这个方法;好像它从来都是一个有特殊地位的、不需要解释的、被忽略存在。直到现在才突然想起来,研究一下这个main()方法到底特殊在哪里。
首先列一下我想到的关于main()方法的几点特殊之处:
- 谁来调用这个main()方法
- 可以写int main();也可以写int main(int argc, char** argv);C语言不支持多态,调用main方法的地方是怎么办到的
关于第一个问题,我在这篇博客中发现了一些答案:https://blog.youkuaiyun.com/honglicu123/article/details/48396923 我按照我未经验证的理解总结一下:执行一个程序,首先由操作系统创建一个进程出来,然后把控制权交给glibc库中的__libc_start_main方法,再调用crt1.o中的_start方法,最终调用到我们的main方法中来。中间涉及到多个链接操作。
第二个问题呢,因为main方法是在crt1.o的_start方法中被调用的,那么看一下crt1.o的源代码应该能找到答案。crt看名字应该是C Runtime Library里的,那就从glibc里找一下。glibc代码地址:https://www.gnu.org/software/libc/sources.html 拉代码花了好久,我等会儿就直接把相关部分贴上来。
暂时还没找到!!