[juliantec_list] Re: Re:我们写C程序为什么就一定得先写个main函数?

  • From: "Yihe Chen" <yihect@xxxxxxxxxxxxxx>
  • To: 何晓波 <hxbcontrol77@xxxxxxx>, 蒋雨 <54jiangyu@xxxxxxxxx>
  • Date: Fri, 25 Feb 2011 17:59:27 +0800


其实我也不是很懂,大家讨论讨论,仅供理解,以下分析基于linux

我认为是不是main开始其实不重要的,如果当初认为是helloword这个名字开始,也许我们今天写程序就是
int helloword(...)

执行任何的程序都要有一个入口:
cpu取指令的时候必须要有个起始点,main的地址应该是放到某个寄存器里。当然这里面涉及到代码的编译,内存管理,寄存器,指令等等,我也不懂。


何,注意回复邮件的时候不要用 top post, 这样结果会比较难看。 看看
http://www.juliantec.info/mlist/mail-lists.html#something-must-to-know
中写的注意事项第9点; 另外也最好用纯文本,养成习惯。


中午吃完饭,发呆。突然想到我们写的C程序为什么就一定要先写个 main 函数?
我们能不能不先写这个函数,或者干脆就换个别的名字勒??


这是个有意思的问题。在 linux 里面,根据TIS 的ELF规范,一个可执行程序,也就是一个可执行的对象文件,它有一个程序进入点,这个进入点不是
我们写的 main 函数,而是位于 c 库中的 _start 汇编代码中。在这个汇编代码中,它会去调用我们写的 main C函数,而这个调用是写死的,所以
我们没办法不用 main 函数。 实际上,假如你的C程序没用用 main 函数,那用 gcc 链接的时候,将会报错。

这个问题,对我们这些学嵌入式系统开发的人来说,应该知道。我们知道,在嵌入式系统上电之后,最先得到执行的将是一小段做初始化用的汇编
代码,这段汇编代码做完硬件如内存控制器的初始化后, 将会给我们准备一个可供 C 程序运行的环境,说白了就是,要准备一个堆栈。 堆栈准备好 后,它会跳转到 C 语言中定义的函数中去继续执行C程序。 那么这个时候,是不是要用 main 函数就随你了,你可以使用其他的,如 tain, bain
之类的任何名称,因为你自己可以修改汇编代码。

回到这个问题,或许可以使用宏来绕过去 main 函数的字面定义 ,但那不是真正的不用main函数,你们可以试一下。

另外 何 也可以研究一下,main 函数在linux 中是如何得到执行的。

This is mail list for linux app development discussing, created by JulianTec, 
see http://www.juliantec.info/mlist/mail-lists.html.


Other related posts: