zoukankan      html  css  js  c++  java
  • 编译器的工作过程

    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文件了

  • 相关阅读:
    stm32 复位后 引起引脚的变化,输出电平引起的问题
    利用jink的驱动软件j-flash 合并两个hex的方法,bootloader+app
    利用jink调试程序,时间不准的解决办法
    为什么你有10年经验,但成不了专家?
    第二章 信息的表示和处理
    Python人名独特性统计

    Python基本统计值计算
    VScode如何编译多个.C文件
    Python连续质数计算
  • 原文地址:https://www.cnblogs.com/huckleberry/p/13789707.html
Copyright © 2011-2022 走看看