elr*_*icL 42 c language-lawyer
好吧标题说明了一切.是一个main()函数的C程序绝对必要的?
我问这个是因为我在查看Linux内核代码,但我没有看到main()函数.
pax*_*blo 63
不,ISO C标准规定main只有托管环境(例如具有底层操作系统的环境)才需要功能.
对于像嵌入式系统(或操作系统本身)这样的独立环境,它的实现是定义的.来自C99 5.1.2:
定义了两个执行环境:独立和托管.在这两种情况下,当执行环境调用指定的C函数时,程序启动发生.
在独立环境中(可以在没有操作系统任何好处的情况下执行C程序),程序启动时调用的函数的名称和类型是实现定义的.
至于Linux本身是如何启动的,Linux内核的起点是start_kernel,为了更全面地了解整个启动过程,你应该从这里开始.
C99指定main()在"程序启动时"在托管环境中调用,但是,您不必使用C运行时支持.您的操作系统执行映像文件并在链接器提供的地址处启动程序.
如果您愿意编写程序以符合操作系统的要求而不是C99的要求,则可以在没有main()的情况下完成.但是,系统越现代化(越复杂),C库就越难以使用标准运行时启动的假设.
这是Linux的一个例子......
$ cat > nomain.S
.text
_start:
call iamnotmain
movl $0xfc, %eax
xorl %ebx, %ebx
int $0x80
.globl _start
$ cat > demo.c
void iamnotmain(void) {
static char s[] = "hello, world\n";
write(1, s, sizeof s);
}
$ as -o nomain.o nomain.S
$ cc -c demo.c
$ ld -static nomain.o demo.o -lc
$ ./a.out
hello, world
Run Code Online (Sandbox Code Playgroud)
现在可以说它不是"C99程序",只是一个带有用C语言编写的目标模块的"Linux程序".