程序转变成可执行文件的过程,hello程序为例

#include

int main()
{
    printf("hello, world\n");
    return 0;
}

hello.c源程序(文本)----预处理器(cpp)---->hello.i修改了的源程序(文本)-----编译器(ccl)---->hello.s汇编程序(文本)

------汇编器(as)------>hello.o可重定位目标程序(二进制)-------链接器(ld)(这里也有别的.o程序)------>hello可执行目标程序(二进制)

 

预处理阶段:预处理器根据以字符#开头的命令,修改原始的C程序。

编译阶段:编译器将文本文件hello.i翻译成文本文件hello.s,它包含了一个汇编语言程序。

汇编阶段:汇编器将hello.s翻译成机器语言指令,把这些指令打包成一种叫可重定位目标程序的格式,并将结果保存在目标文件hello.o中。 

链接阶段:printf函数存在于printf.o的单独的与编译好了的目标文件中,而这个文件必须以某种方式合并到hello.o中,链接器就是负责这种合并。

 

运行hello程序

shell等待我们输入命令,输入 ./hello  后,shell程序将字符逐一读入寄存器,再放到内存中。

敲击回车后,结束命令输入,shell执行一系列指令加载可执行的hello文件,它放在磁盘里的,代码数据复制到主存。

然后处理器执行hello程序的main程序中的机器语言指令,这些指令将“hello, world\n”字符串中的字节从主存复制到寄存器文件,再复制到显示设备,显示在屏幕上。

 

 

 

你可能感兴趣的:(深入理解计算机系统学习笔记)