为什么每个C程序都需要一个叫做main的函数

当加载器运行时,它创建一个如下图的运行时存储器映像(存在一段较短的时间,在虚拟地址空间上)。在可执行文件中段头部表的指导下,加载器将可执行文件的的相关内容拷贝到代码和数据段,然后加载器跳转到程序的入口点,也就是符号_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将控制返回给操作系统。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值