• 编译器的工作过程


    img
    由上图可知gcc编译器驱动程序在读取了hello.c文件之后,把它翻译成了一个可执行代码。此过程共经历了4个阶段的程序,分别是预处理器,编译器,汇编器,链接器,此4个截断程序一起构成了编译系统。接下来我就为大家详细说明以下此4个阶段程序各自的具体工作

    1.预处理阶段

    预处理器会将以字符#开头的语句,修改为原始的c程序,比如hello.c中的#include

    gcc -E hello.c -o hello.i1
    

    用vim打开hello.i文件之后如下图
    这是文件开头
    img
    这是文件结尾处
    img

    我想大家一定会惊讶的发现一个简简单单的hello,world程序竟然会平白无辜的增加了800多行,没错这就是预处理器干的,它将程序中以#开头的stdio.h文件的内容都加了进来
    需要强调的是,经预处理器的文件是文本文件

    2.编译器

    编译器会将上文中提到的hello.i(预编译好的文件)近一步翻译成保存汇编语言的文本,其后缀会变为.s
    我们可以通过如下方式将hello.c编译成.s文件

    gcc -S hello.c -o hello.s1
    

    打开hello.s文件如下图
    img
    可以看到里面的代码变为了汇编代码
    需要注意的是.s文件依然是文本文件

    3.汇编器

    汇编器会将上述的hello.s文件翻译成机器语言指令,并把这些指令打包成一种叫做可重定位目标程序的格式并将结果保存在新生成的二进制文件hello.o中

    4.链接阶

    我们的程序hello中调用了printf函数,而printf函数存在于由c标准库提供的名为printf.o的单独预编译好了的目标文件中,所以我们要调用printf函数,就得通过链接器,使其通过它自己的方式将hello.o和printf.o这俩个文件合并在一起,经过合并后的文件就是可执行的hello文件了

  • 相关阅读:
    python 继承与组合
    google浏览器安装不上的绝望经历
    python 类,对象
    Javascript学习笔记——闭包
    面试小结:html/css实现元素居中
    @清晰掉 qsort()
    @清晰掉 sprintf sscanf双胞胎
    @清晰掉 GDB调试器中的战斗机
    @大脑练习: 计算两个矩阵的乘积
    js测试用
  • 原文地址:https://www.cnblogs.com/huckleberry/p/13789707.html
Copyright © 2020-2023  润新知