#include <stdio.h>
int main()
{
printf("Hello World!";
return 0;
}
-------------------------------------------------helloworld.c-----------------------------------------------------

涉及到的crt系列文件包括 crt1.o,crti.o,crtn.o,crtbegin.o,crtend.o。这一系列crt.o的作用马上就会看到。
当我们运行这个C程序的时候,我们需要一个可供程序运行的c runtimeenvironment。就好比操作系统需要运行在硬件之上,C程序需要运行在c runtimeenvironment之中。ubuntu下的c runtime enviroment就是由上述crt系列定义的(crt是cruntime的缩写)。
crt在main程序运行之前为我们做了这些:
1.建立stdin/stdout/stderr流
2.将main函数接受的两个参数(argc,argv)压入栈中,供main调用
3.不同的操作系统还可能要求的一些其他操作。
抽象介绍不好理解,上代码。
一个最简单的crt文件可以用如下汇编表示:
上面这段代码执行了一个crt文件的最基本操作:读取需要传送给_start的两个参数argcargv,然后以逆序压入栈中,然后调用main函数,main返回时,从栈中弹出argcargv。然后将main的返回值存储在eax中。调用exit函数告诉系统main已结束。extern main extern exit global _start _start: mov eax, [esp + 4] mov ebx, [esp + 8] push ebx push eax call main add esp, 8 push eax call exit
如果在链接时不加入crt部分会有什么效果?还是让gcc告诉我们吧。-nostdlib命令会让gcc在链接时不链接一切标准函数库,包括crt系列。(为了方便测试,我将hello_world中的printf函数注释掉了,然后将文件重命名为test_main.c。不注释掉printf的效果还是各位看官自己测试吧)
输入gcc -o test test_main.c -nostdlib 然后运行test 效果如下图所示: