gcc和clang编译器都是支持的自定义入口点的,用户可以通过-e选项来指定自定义的入口点。
编写如下代码:
//文件名:test.c
#include <stdio.h>
#include <stdlib.h>
int test(int argc, char *argv[]) ;
int main(int argc, char *argv[]);
int main(int argc, char *argv[])
{
printf("HELLO main\n" );
printf("PRESS ANY KEY TO EXIT\n");
return (0);
}
int test(int argc, char *argv[])
{
int val;
printf("HELLO test()\n");
val = main(argc, argv);
exit(val) ;
}
通过如下命令更改入口点:
gcc -nostartfiles -e test test.c -o test
或
clang -nostartfiles -e test test.c -o test
就可以编译成功:
但是,如果执行test程序,就会出现段错误,这是因为我们没有初始化标准输入输出,而printf函数需要使用标准输入和输出,因为访问了不存在的资源,所以就导致了段错误。
根据参考一中的内容可知,gcc默认的入口点_start函数在调用main函数之前,会先做一系列的初始化工作,以确保main函数所需的资源准备好。
因此,如果用户想要自定义入口点,那就必须自己做一系列的初始化工作,以确保自己的功能代码在执行之前,所需要访问的资源都准备好。