可以如果主函数命名为main,那么编译器会自动生成一个名为 _main 的函数,并将其作为 main 函数的入口点,也就是说先执行_main再执行main,实际上,_main 函数是由 C 库提供的,它会在程序启动时执行一些初始化操作,然后调用用户定义的 main 函数,并在 main 函数返回后执行一些清理操作。 总之,在使用标准的 C 库时,main 函数会默认调用 _main 函数,用户无需关心 _main 函数的具体实现,只需要在 main 函数中编写自己的代码即可。
main.c如下
启动代码如下
最后的MAP文件如下,可以发现多了一个从未使用过的!!!main 数据段,来自__main.o文件
如果将main.c的main函数与汇编文件的IMPORT main的main都修改为mymain,
main.c如下
启动文件如下
最后的map如下
可以发现此时就不会调用____main了
总结:存在main函数,会自动调用__main,在执行完__main后在执行main
为什么已经使用了SPACE后面还使_user_initial_stackheap 来初始化堆栈
在代码中,__user_initial_stackheap 是一个符号,它指向堆栈和堆空间的初始化函数。在初始化堆栈和堆空间时,程序会调用该函数来完成初始化。 在启动文件中,使用 SPACE 指令开辟了一段连续的内存空间,但这些空间并没有被初始化。因此,在程序运行时,需要调用 _user_initial_stackheap 函数来初始化堆栈和堆空间。该函数会将堆空间和堆栈的起始地址和大小传递给运行时库,然后运行时库会在该地址范围内分配堆空间和堆栈,并进行必要的初始化操作。 因此,使用 SPACE 指令在启动文件中开辟内存空间只是为了定义堆栈和堆空间的位置和大小,而初始化堆栈和堆空间的工作需要通过调用 _user_initial_stackheap 函数来完成。