gcc1

这几天学习关于GCC在进行编译链接的时候到底进行了什么样的工作。
我就感觉这些东西要是不明白的话就总是感觉写程序的时候不安心,
总感觉不能透彻的了解这个问题,所以找了一些资料来看,来争取解决
这个困扰的问题。

参考资料:程序员的自我修养。强烈推荐,这是本好书
 

       同时推荐一个系列博文,编程修养,写的很好。

平台: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文件或者库文件链接在一起,形成一个真正可执
      行的文件。

下面主要的篇幅就是关于链接了。   
原文地址:https://www.cnblogs.com/hpf311/p/2576090.html