再把上节代码贴出来,
1 //int main(void) {2 int _start(void) {3 while(1);4 return 0;5 }
有没有同学想过,这里写一个_start函数,让其调用main函数如何?其实这是可以的,main函数并不是第一个函数,它实际上也是被别人调用的,不过这是编译器背后的策略啦,好奇心大的同学自己尝试下吧。
虽然把函数名改成_start可以解决问题,但我们习惯于main函数做为主函数,不习惯函数用_start,于是用了-e来指定起始的函数名为main,所以代码才链接正常。
也许有同学想过,哎?我平时写的程序也没有_start啊,直接用gcc编译后就能运行,没出过问题啊。是啊,确实如您所说,由于我也没深入研究过,但咱们通过比较的方式,让您自己悟出这里面的秘密。还是用上述代码为例,gcc –o /tmp/test.bin kernel/main.c编译链接,由于未加-c参数,生成的test.bin不再是目标文件而是可执行文件。然后再用先编译成目标文件再链接成可执行文件的方式,对比这两个文件的区别。见图