zoukankan      html  css  js  c++  java
  • 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文件或者库文件链接在一起,形成一个真正可执
          行的文件。

    下面主要的篇幅就是关于链接了。   
  • 相关阅读:
    Zookeeper 基础知识【1】
    Spark 基础复习【1】
    ZooKeeper 入门 一致性
    Hive 视图 索引
    Yarn调度 历史与基础
    mysql 优化【1】
    TCP IP知识梳理
    Java 基础 锁
    Spark 累加器使用
    RATE-MAX----beta答辩博客
  • 原文地址:https://www.cnblogs.com/hpf311/p/2576090.html
Copyright © 2011-2022 走看看