当加载器运行时,它创建一个如下图的运行时存储器映像(存在一段较短的时间,在虚拟地址空间上)。在可执行文件中段头部表的指导下,加载器将可执行文件的的相关内容拷贝到代码和数据段,然后加载器跳转到程序的入口点,也就是符号_start的地址。在_start地址处的启动代码(startup code)是在目标文件ctr1.o(参考下面代码)中定义的,对所有C程序都是一样的。它会最终调用应用程序的main函数。除了一些头部信息,在加载过程中没有任何从磁盘到存储器的数据拷贝。直到CPU引用一个被映射的虚拟页才会进行拷贝,此时,操作系统利用它的页面调度机制自动将页面从磁盘传送到存储器。
0x080480c0 <_start>: /* Entry point in .textca */
call __libc_init_first /* Start code in .text */
call _init /* Startup code in .init */
call atexit /* Startup code in .text */
call main /* Application main routine */
call _exit /* Returns control to OS */
有了上述的基础之后,我们很自然的可以回答题目中的问题,C的启动代码对于每个C程序都是相同的,要跳转到一个叫做main的函数上。
另外一个问题main函数要不要return的问题,如果以return结尾,那么控制传递给启动程序,该程序通过调用_exit再将控制返回给操作系统。如果用户省略了return,也会发生同样的事情,因为是本质是过程调用。如果main以调用exit终止,那么exit将通过调用_exit将控制返回给操作系统。