现在的位置: 首页 > 综合 > 正文

编译简介

2013年10月14日 ⁄ 综合 ⁄ 共 925字 ⁄ 字号 评论关闭

平台:linux
编译器:GCC
源文件:hello.c

到底GCC在将源文件编程可执行文件的时候做了什么工作呢,首先你得
指导GCC的常用命令吧,GCC在工作的步骤为:
1. 预编译
  命令: gcc -E hello.c -o hello.i
     或者 cpp hello.c > hello.i
        然后你就可以gedit hello.i来打开它。好好比较下两者
    的内容
  主要作用:1. 展开所有的#define宏,就是在用到宏的地方进行替换。
         同时删除该宏
      2. 处理所有的条件编译选项,包括#if 等等
      3. 处理所有的#include指令,直接在包含的位置展开文件
         如果被包含的文件里面还包含其它的文件,那么递归展开
         4. 删除所有的注释
      5. 添加行号和文件名注释,以便在编译的时候输出信息
      6. 保留#pragma宏,因为编译器需要使用

2. 编译
  命令:gcc -S hello.i -o hello.s
     或者 调用你的gcc目录下的cc1程序,gcc目录一般在/usr/lib/下
       cc1 hello.i > hello.s
       然后你还是可以gedit hello.s来打开它,看看里面汇编的代码
  主要作用:1. 编译的过程是词法分析,语法分析,语义分析,目标代码
         生成,主要是用来生成汇编代码。好好看看编译原理方面
         的内容即可。

3. 汇编
  命令:gcc -c hello.s -o hello.o
     或者 as hello.s -o hello.o
       然后生成了常见的.o文件了,再怎么办?gedit打不开的,因为
          事实上.o文件已经算是一种可执行文件了,所以可以采用工具
    objdump ,readelf来进行查看。具体工具使用后面会说到。
  主要作用:1. 翻译汇编代码到目标代码,然后生成中间文件
    
4. 链接
  命令:ld
      详细的命令比较复杂,链接是是程序运行过程中最复杂的一个部分了
      目的就是将不同的.o文件或者库文件链接在一起,形成一个真正可执
      行的文件。

抱歉!评论已关闭.