一般来说程序从main函数开始。但实际是main函数并不是必须的。
实际上main函数只是用户代码的入口,它会由系统库去调用
在main函数之前,系统库会做一些初始化工作,比如分配全局变量的内存,初始化堆、线程等。
当main函数执行完后,会通过exit()函数做一些清理工作,用户可以自己实现_start函数:
-
test.c
#include <stdio.h> #include <stdlib.h> int _start() { printf("hello.\n"); }
编译: gcc test.c -nostartfiles -o app
-
这样可以输出hello,但是会出错,因为我们这样实际上是覆盖了系统的_start()函数,而系统的_start()开始之前做初始化工作,而结束后会进行回收工作。
-
那么我们就需要自己进行回收。
#include <stdio.h> #include <stdlib.h> int _start() { printf("hello.\n"); exit(0); // exit()函数会结束进程并且回收资源 }
-
进一步,我们可以指定程序入口,而不使用_start()。
#include <stdio.h> #include <stdlib.h> int aa() { printf("hello.\n"); exit(0); // exit()函数会结束进程并且回收资源 }
编译: gcc test.c -nostartfiles -e aa -o app