码迷,mamicode.com
首页 > 其他好文 > 详细

程序员的自我修养-编译和链接

时间:2015-04-22 23:55:01      阅读:260      评论:0      收藏:0      [点我收藏+]

标签:

技术分享

1. 预编译:主要处理源文件中的以#开始的预编译指令。 (经过预编译后的.i文件不包含任何宏定义,因为所有的宏已经被展开,并且包含的文件也已经被插入到.i文件中)

  • 将所有的#define删除,并且展开所有的宏定义
  • 处理所有条件预编译指令,比如:#if,#ifdef
  • 处理#include预编译指令,将被包含的文件插入到该预编译指令的位置
  • 删除所有注释
  • 添加行号和文件名标识,以便于编译时编译器产生调试用的行号信息及用于编译时产生编译错误信息或告警时能显示行号
  • 保留所有的#pragma编译器指令,以为编译器需要使用它们。

2. 编译:编译过程就是把预处理完的文件进行一系列词法分析、语法分析、语义分析以及优化后生成相应的汇编代码文件。

3. 汇编:汇编器是将汇编代码转变成机器可以执行的命令,每一个汇编语句几乎都对应一条机器指令。所以汇编过程相对比较简单,它没有复杂的语法,也没有语义,也不需要做指令优化,只是根据汇编指令和机器指令的对照表一一翻译就可以了。

4. 链接:在一个程序被分割成多个模块以后,这些模块之间如何组合成一个单一的程序是需要解决的一个问题。模块之间如何组合的问题可以归结为模块之间如何通信的问题,最常见的属于静态语言的C/C++,模块之间通信有两种方式,一种是模块间的函数调用,另外一种是模块间的变量访问。函数访问需要知道目标函数的地址,变量访问也需要知道目标变量的地址所以这两种方式可以归结为模块间符号的引用。这个模块的拼接过程就是连接。

其实链接器就是把一些指令对其他符号地址的引用加以修正。链接过程蛀牙包括地址和空间分配,符号决议和重定位等

程序员的自我修养-编译和链接

标签:

原文地址:http://www.cnblogs.com/java-cjt/p/4448848.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!