理解编译器在编译过程中做了什么

2023-11-02

今年开了操作系统课,课上老师提了一个问题:从一个保存程序代码的文本文件到可执行的程序,编译器做了啥?由于之前买过<<深入了解计算机系统>>这本书,刚买来时受热就翻了其中一部分章节,其中就有讲到上述所问的讲解,索性就参考其上的讲解写出来

我会以一个hello.c的c程序贯穿整个文章,具体代码如下

#include<stdio.h>

int main(int argc,char **argv)
{
    printf("hello world\n");
    return 0;
}
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

该程序通过编译器编译生成hello程序,其运行结果如下 
 
那么此程序从保存它的文本文件到可执行程序hello的中间编译器究竟做了啥,不说话先上图了 

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

1.预处理阶段

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

gcc -E hello.c -o hello.i
 
 
  • 1

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

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

2.编译器

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

gcc -S hello.c -o hello.s
 
 
  • 1

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

3.汇编器

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

4.链接阶

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

理解编译器在编译过程中做了什么 的相关文章

  • 课程设计总结

    1 政府职能部门 望细分 具体 课程压缩所致 2 企业家 结构好 利于规划 参考 强烈希望协调与管理融合进来 3 工程师 技术人员 指导行强 望精化 深化 细化 4 学生 利于未来规划 创业 就业 发展 学习方向等等 老师总结课程缺陷 1
  • MQTT客户端应用编程及接口分析

    MQTT客户端应用编程及接口分析 MQTT协议简介 MQTT是一个基于客户端 服务器的消息发布 订阅传输协议 MQTT协议是轻量 简单 开放和易于实现的 这些特点使它适用范围非常广泛 客户端服务端安装 1 安装 sudo apt add r
  • 数据下载网站整理

    数据十分重要 如何找到理想的数据显得更重要了 这里记录自己经过网上查询到的数据 进行整理 如果侵权 请联系我删除 再次感谢网友大佬们提供的资料 1 中国气象站点数据 下载地址 https www resdc cn data aspx DAT
  • UWB与蓝牙AOA定位技术简要对比

    1 UWB基本原理 UWB 超宽带技术 是基于IEEE802 15 4a z标准的利用纳秒级窄脉冲进行数据传输的无线通信技术 主要服务于微位置 micro location a person s placement to within a
  • 第二届网刃杯--部分Re

    1 freestyle ida中分析有个两个fun atoi 将字符转换为整数 得到答案为3327105 MD5加密提交 2 Re function 没有提供密码 但是在右边看到熟悉的89 50 利用winhex保存出来 得到解压密码 解压
  • node版本管理工具nvm

    1 标题卸载nvm和node js 系统变量中删除nvm添加变量 NVM HOME和NVM SYMLINK 环境变量中 path 删除nvm自动添加的变量 Path NVM HOME NVM SYMLINK 删除自身安装node环境 参考图
  • “条件递进式编程”技巧两例

    什么是 条件递进式编程 呵呵 这是我自己起的名字 所谓条件递进式编程 就是指需要一系列相关函数组合执行的情况下 后续函数执行的必要性由前面所有函数执行是否成功来决定 比如说 有一系列函数如下DoSomething1 DoSomething2
  • DHCP的配置(以华为eNSP为例)

    如有错误 敬请谅解 此文章仅为本人学习笔记 仅供参考 如有冒犯 请联系作者删除 基础知识介绍 络组建步骤 1 拓扑设计 2 IP地址规划 按照拓扑中划分的 络范围 规划 络位不同的IP地址 3 配置 1 配置各个节点的IP地址 2 路由 全
  • 【软件测试】用例篇

    一 什么是测试用例 测试用例 向被测试系统发起的一组集合 这组集合包含测试数据 测试步骤 测试平台 预期结果 二 为什么在测试前要设计测试用例 三 基于需求设计测试用例 3 1测试是我们测试人员进行测试的依据 3 2测试人员首先要分析需求
  • 碎碎念之工作②

  • GNURadio报错Unable to create context(windows10环境)

    GNURadio报错Unable to create context windows10环境 这里本人使用的是GNU Radio3 7 11 iiosupport win64 版本 外设是ADI的ADALM PLUTO 这里本人使用的是GN
  • TRMF 辅助论文:最小二乘法复现TRMF

    1 目标函数 总 论文笔记 Temporal Regularized Matrix Factorization forHigh dimensional Time Series Prediction UQI LIUWJ的博客 CSDN博客 1
  • 杂七杂八的小知识

    杂七杂八的小知识 前端知识 Node js安装注意事项 Vue学习文档 Mysql数据库小知识 安装数据库后使用数据库所需步骤 MySQL远程连接 常用数据库命令 mysql数据库导入查询 StarUML使用教程 docker小知识 cma
  • 远程控制 ToDesk

    ToDesk 远程控制软件 支持跨平台的远程控制 有且不限于PC对PC iOS Android也可以直接控制 最近发现的一个好用的远程连接软件 也是近些年非常火热的 远程控制软件 ToDesk 虽然 QQ 和 向日葵 也都可以满足我们实现的
  • GitHub Action入门简介

    1 What is GitHub Actions GItHub Actions是一个持续集成和持续交付的平台 能够让你自动化你的编译 测试和部署流程 GitHub 提供 Linux Windows 和 macOS 虚拟机来运行您的工作流程
  • Freertos 在contexM0芯片上的移植

    1 freertos源码 官网下载地址 https www freertos org 下载LTS长期支持版本 2 在工程目录下新建FreeRTOS文件夹 将FreeRTOS 的源码添加到这个文件夹中 portable 文件夹中只需要复制 k
  • 什么是离岸公司?有什么作用?

    离岸公司是泛指在离岸法区内依据其离岸公司法规范成立的有限责任公司或股份有限公司 这些公司不能在注册地经营 而主要是在离岸法区以外的地方开展业务活动 离岸公司的主要特点包括高度保密性 无外汇管制和减免税务负担 离岸公司的作用主要有以下几个方面
  • 如何FL Studio显示中文?切换语言教程

    你是不是也在为fl studio的英文界面而苦恼 你是不是也想让你的fl studio 说中文 方便你制作音乐 你是不是也在网上找了很多教程 却发现都是复杂的 或者已经过时的 如果你的答案是肯定的 那么你来对地方了 今天 我要教你一个一步到
  • 看完这篇 教你玩转镜像转换神器qumu实现虚拟机做题自由!

    前言 最近有小伙伴说比赛没设备 问有没有不需要设备也能实现做题自由的方法 今天这里分享一期 看完这篇你将学会 使用 qumu 转换镜像格式 一般我们做题都是 img 格式的环境 需要导入设备 有些小伙伴没有设备 就可以使用这种方法 把 im
  • Mac/Linux虚拟机CrossOver2024新版下载使用教程

    CrossOver不像Parallels或VMware的模拟器 而是实实在在Mac OS X系统上运行的一个软件 该软件可以让用户在mac是上直接运行windows软件 本文为大家带来的是CrossOver Mac版安装教程 CrossOv

随机推荐

  • JavaScript进阶之高阶函数(Higher-order function)

    你还在以为 map reduce filter 是高阶函数吗 高阶函数听上去很让人不明觉厉 但其实也并没有什么特别厉害的地方 只是网上的定义一直让我们有点模糊而已 接下来我们来详细讲讲 首先是定义 查自百度百科 定义 在数学和计算机科学中
  • 二进制安装docker

    二进制安装docker文档 建模部署 docker安装 下载docker 因rpm包安装依赖较多 选择二进制安装 下载地址如下 https download docker com linux static stable x86 64 创建d
  • 区域生长

    转自 https blog csdn net qq 37764129 article details 81227091 注 本程序只能做图像分割 结果图是转自原作者的 暂时没实现该功能 1 理论基础 区域生长算法的基本思想是将有相似性质的像
  • 称重问题递归解法

    用天平称重时 我们希望用尽可能少的砝码组合称出尽可能多的重量 如果只有5个砝码 重量分别是1 3 9 27 81 则它们可以组合称出1到121之间任意整数重量 砝码允许放在左右两个盘中 本题目要求编程实现 对用户给定的重量 给出砝码组合方案
  • 【小沐学NLP】Python实现中文、英文分词

    NLP开发系列相关文章编写如下 1 小沐学NLP Python实现词云图 2 小沐学NLP Python实现图片文字识别 3 小沐学NLP Python实现中文 英文分词 4 小沐学NLP Python实现聊天机器人 ELIZA 5 小沐学
  • win10 提供管理员权限才能删除文件夹

    计算机管理员帐户 也就是我们熟知的 Administrator 拥有可执行影响其他用户操作的权限 由于win10专业版刚发布 很多用户不知道怎么取得管理员权限 接下来小编就跟大家分享启用管理员权限的方法 1 打开win10专业版的开始菜单中
  • 手把手教你--JAVA微信支付(H5支付)

    概述 之前说过 有时间把微信支付的H5支付讲解下 一直拖了半年时间 最近的项目正好又温习了支付功能 趁着热乎 抓紧起来 微信的H5支付 相对公众号支付 容易了跟多 很多相似的东西 也有不同之处 这里只介绍H5支付的关键点 其他内容请先去看我
  • linux系统编程:线程同步-信号量(semaphore)

    线程同步 信号量 semaphore 生产者与消费者问题再思考 在实际生活中 只要有商品 消费者就可以消费 这没问题 但生产者的生产并不是无限的 例如 仓库是有限的 原材料是有限的 生产指标受消费指标限制等等 为了进一步 解决好生产者与消费
  • Go(1)之基本使用

    Go 1 之基本使用 Author Once Day Date 2023年1月8日 漫漫长路 有人对你微笑过嘛 参考文档 Go程序设计语言 Go 语言教程 菜鸟教程 runoob com Go 语言教程 w3cschool 1 概述 Go语
  • C语言(Head First C)-6_2:结构、联合与位字段:结构更新、联合、枚举和位字段

    该系列文章系个人读书笔记及总结性内容 任何组织和个人不得转载进行商业活动 6 2 结构 联合与位字段 结构更新 联合 枚举和位字段 如何更新结构 结构就是把一组绑在一起的变量当做一条数据处理 我们已经学会了创建结构对象 并使用点表示法访问结
  • 【微信小程序地理位置权限】wx.getLocation申请教程+申请素材

    为进一步规范开发者调用涉用户信息相关接口或功能 保障用户合法权益 平台将对如下地理位置相关接口调用实行准入开通 wx getLocation wx onLocationChange wx chooseAddress wx chooseLoc
  • 解决:Oops internal error 40343 occured.Further work is not possible and IDA will close (打开文件出现40343错误)

    问题 IDA pro打开文件出现40343错误 解决方法 换一个安装目录或者重新软件 修改文件名名称 不能是中文 测试 最后修改了文件夹名称为全英文就可以 打开了 希望对大家有所帮助谢谢大家观看
  • 数字时代的抉择,金蝶 EBC 的破局

    今年 10 月 Gartner 发布了企业在 2021 年需要关注的重要战略科技趋势 其中 可组装的企业 一词引起热议 Gartner 认为原本为了提高效率而建立的静态业务流程很脆弱 在疫情的冲击下容易变得支离破碎 因此企业应具有不断重组与
  • 5.28 深圳活动|Jina AI 生态助力云原生场景下的 AIGC 应用开发

    亚马逊云科技 Community Day 将于 5 月 28 日 在深圳南山区海德酒店 11 楼举办 Jina AI 软件工程师付杰将带来 Jina AI 生态助力云原生场景下的 AIGC 应用开发 的主题演讲 Community Day
  • 数据探索(数据特征分析)④—Python分布分析、对比分析、统计量分析、期性分析、贡献度分析、相关性分析

    Python介绍 Unix Linux Window Mac 平台安装更新 Python3 及VSCode下Python环境配置配置 python基础知识及数据分析工具安装及简单使用 Numpy Scipy Matplotlib Panda
  • 1080T、2080T、4070T显卡的深度学习性能测试和结论

    本文更新地址 4070Ti 4090显卡的深度学习性能测试和结论 哔哩哔哩 先说结论 4070T显卡FP32的训练和推理速度跟3090应该基本类似 但由于显存12G偏低 4070T不太适合如今的深度学习模型训练 新手列外 大部分模型都能训练
  • NP完全性理论与近似算法

    一 NP完全性理论 1 在图灵机计算模型中 移动函数 是单值的 即对于Q Tk中的每一个值 当它属于 的定义域时Q T L R S k 中只有唯一的值与之对应 称这种图灵机为确定性图灵机 简记为DTM Deterministic Turin
  • vivado 寄存器输出到寄存器输入 建立时间_Vivado时序约束篇——时钟约束

    此系列文章为在学校时的笔记总结 主要记录总结Xilinx Vivado工具中的时序约束 主时钟 primary clock 主时钟应首先被定义 因为其他时序约束往往以主时钟为参照标准 主时钟的定义往往应定义在输入端口 而不是clock bu
  • Windows下运行Tomcat服务时报GC Overhead Limit Exceeded

    根本原因是在新建Tomcat作为Windows服务时 系统默认设置的堆内存太小了 我们打开 bin service bat文件 将如下图所示的默认值改大一些就好了 if JvmMs set JvmMs 512 if JvmMx set Jv
  • 理解编译器在编译过程中做了什么

    今年开了操作系统课 课上老师提了一个问题 从一个保存程序代码的文本文件到可执行的程序 编译器做了啥 由于之前买过 lt lt 深入了解计算机系统 gt gt 这本书 刚买来时受热就翻了其中一部分章节 其中就有讲到上述所问的讲解 索性就参考其