在之前的文章中,介绍了main函数的返回值 和 main函数的传参,本文主要介绍一下main函数的执行顺序。可能有的人会说,这还用说,main函数肯定是程序执行的第一个函数。那么,事实果然如此吗?相信在看了本文之后,会有不一样的认识。
为什么说main()是程序的入口
linux系统下程序的入口是”_start”,这个函数是linux系统库(Glibc)的一部分,当我们的程序和Glibc链接在一起形成最终的可执行文件的之后,这个函数就是程序执行初始化的入口函数。
通过一个测试程序来说明:
#include <stdio.h>
int main()
{
printf("Hello world\n");
return 0;
}
编译:
gcc testmain.c -nostdlib # -nostdlib (不链接标准库)
程序执行会引发错误:/usr/bin/ld: warning: cannot find entry symbol _start; 未找到这个符号
所以说:1. 编译器缺省是找 __start 符号,而不是 main
2. __start 这个符号是程序的起始
3. main 是被标准库调用的一个符号
那么,这个_start和main函数有什么关系呢?下面我们来进行进一步探究。
_start函数的实现
该入口是由ld链接器默认的链接脚本指定的,当然用户也可以通过参数进行设定。_start由汇编代码实现。大致用如下伪代码表示:
void _start()
{
%ebp = 0;
int argc = pop from stack
char ** argv = top of stack;
__libc_start_main(main, argc, argv, __libc_csu_init, __linc_csu_fini,
edx, top of