随笔 - 46  文章 - 39  trackbacks - 0
<2012年5月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

常用链接

留言簿(2)

随笔分类

随笔档案

友情链接

搜索

  •  

最新评论

阅读排行榜

评论排行榜

例子:

环境:linux
编译器:gcc
源码:hello.c

1 #include <stdio.h>
2 
3 int main()
4 {
5       printf("hello, world\n");
6 }


:~$ gcc -o hello hello.c

1、 源码文件hello.c           通过预处理器->修改过的源码文件hello.i
2、                     hello.i   通过编译器->汇编代码hello.s
3、                    hello.s   通过汇编器->浮动文件hello.o
4、        hello.o+printf.o   通过连接器->可执行文件hello。



1、预处理阶段    预处理器(cpp)根据#后面的指令修改源代码。例:hello.c中的#include <stdio.h> 命令告诉预处理器把系统头文件stdio.h插入到程序中生产另外一个C程序,一般后缀名为.i。

2、编译阶段       编译器(cc1)把hello.i文件转化成汇编代码hello.s文件。

3、汇编阶段       汇编器(as)把hello.s转化成机器语言指令浮动文件程序hello.o。

4、连接阶段       hello程序调用了标准C库printf函数。连接器(ld)把printf.o和hello.o连接成hello可执行文件。
posted on 2012-05-24 14:10 canaan 阅读(2306) 评论(2)  编辑 收藏 引用 所属分类: 读书笔记

FeedBack:
# re: 编译器编译原理四部曲 2012-06-20 10:09 ZRJ
请问一下,连接阶段之后,是不是说生成的hello可执行文件就包括了printf.o的全部内容呢,就是说,可执行文件到了一个没有printf.o的地方也可以正常执行?  回复  更多评论
  
# re: 编译器编译原理四部曲 2013-05-07 21:48 canaan
@ZRJ
是的,printf.o已经被合并到执行文件当中了  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理