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个参数,然后调用main
。 main
返回后, exit
被调用。
如果程序不想使用C运行时环境,则需要为_start
提供自己的代码。 例如,Go编程语言的参考实现是这样做的,因为他们需要一个非标准的线程模型,这个模型需要一些魔术。 当你想写非常规的小程序或程序时,提供你自己的_start
也是有用的。
而从程序员的angular度来说, main
是程序的入口点, _start
是操作系统视angular(从OS启动程序之后执行的第一条指令)通常的入口点,
在一个典型的C语言特别是C ++程序中,在执行进入main之前已经完成了很多工作。 特别是像全局variables初始化的东西。 在这里你可以find一个很好的解释_start()
和main()
之间的所有事情,也是在main再次退出之后(见下面的注释)。
编译器编写者通常会在启动文件中提供必要的代码,但是通过标记–nostartfiles
您基本上可以告诉编译器:“不要麻烦给我标准的启动文件,让我完全控制正在发生的事情从头开始”。
这在embedded式系统中有时是必要的,经常使用。 例如,如果您没有操作系统,并且在初始化全局对象之前必须手动启用内存系统的某些部分(例如,高速caching)。