C中_start()的用法是什么?

我从我的同事那里得知,可以编写并执行一个C程序,而无需编写main()函数。 它可以按照下面的方式完成

withoutMain.c

 // Compile it with gcc -nostartfiles void _start() { int ret = my_main(); exit(ret); } int my_main() { puts("This is a program without main!\n"); return 0; } 

编译为: gcc -o withoutMain withoutMain.c –nostartfiles

运行它为: ./ withoutMain

我的问题是什么时候需要做这种事情? 一些真实世界的场景?

符号_start是程序的入口点 。 也就是说,该符号的地址是在程序启动时跳转到的地址。 通常,名称为_start由一个名为crt0.o的文件提供,该文件包含C运行时环境的启动代码。 它设置了一些东西,填充参数数组argv ,计算有多less个参数,然后调用mainmain返回后, exit被调用。

如果程序不想使用C运行时环境,则需要为_start提供自己的代码。 例如,Go编程语言的参考实现是这样做的,因为他们需要一个非标准的线程模型,这个模型需要一些魔术。 当你想写非常规的小程序或程序时,提供你自己的_start也是有用的。

而从程序员的angular度来说, main是程序的入口点, _start是操作系统视angular(从OS启动程序之后执行的第一条指令)通常的入口点,

在一个典型的C语言特别是C ++程序中,在执行进入main之前已经完成了很多工作。 特别是像全局variables初始化的东西。 在这里你可以find一个很好的解释_start()main()之间的所有事情,也是在main再次退出之后(见下面的注释)。
编译器编写者通常会在启动文件中提供必要的代码,但是通过标记–nostartfiles您基本上可以告诉编译器:“不要麻烦给我标准的启动文件,让我完全控制正在发生的事情从头开始”。

这在embedded式系统中有时是必要的,经常使用。 例如,如果您没有操作系统,并且在初始化全局对象之前必须手动启用内存系统的某些部分(例如,高速caching)。