c语言程序的编译过程

2023-05-16

操作系统:ubantu
工具gcc
文件:test.c

abner@DESKTOP-M6D2HEN:~/mytest$ cat test.c
#include<stdio.h>

#define MAXC 3

#define MAXB MAXC + 1

#define MAXA MAXB + 2

int main()
{
        int a = MAXA;
        return 0;
}

主要为四个阶段

预处理->编译->汇编->连接

C语言编译过程分成四个步骤:
1,由.c文件到.i文件,这个过程叫预处理
2,由.i文件到.s文件,这个过程叫编译
3,由.s文件到.o文件,这个过程叫汇编
4,由.o文件到可执行文件,这个过程叫链接

当然一般不会单独生成.i .s中间文件。也不会一步步进行c代码的编译

预处理

(1)将所有的#define删除,并且展开所有的宏定义。说白了就是字符替换
(2)处理所有的条件编译指令,#ifdef #ifndef #endif等,就是带#的那些
(3)处理#include,将#include指向的文件插入到该行处,展开头文件
(4)删除所有注释
(5)添加行号和文件标示,这样的在调试和编译出错的时候才知道是是哪个文件的哪一行
(6)保留#pragma编译器指令:其他以#开拓的都是预编译指令,但是这个指令例外,此为编译器指示字,所以此步骤需要保留,关于此指示字的具体用法,在后面的内容将会详细讲解。

预处理阶段其实就是将源文件进行完全展开,删除不必要的项,增加必要的项。

abner@DESKTOP-M6D2HEN:~/mytest$ gcc -E test.c -o test.i
abner@DESKTOP-M6D2HEN:~/mytest$ ll
total 32
drwxrwxrwx 1 abner abner  4096 Feb  2 01:58 ./
drwxr-xr-x 1 abner abner  4096 Jan 31 23:07 ../
-rw-r--r-- 1 abner abner   122 Jan 31 23:07 test.c
-rw-r--r-- 1 abner abner 17929 Feb  2 01:58 test.i

在这里插入图片描述

编译

编译过程一般包含:
(1)词法分析
(2)语法分析
(3)语义分析
(4)源代码优化
(5)目标代码生成
(6)目标代码优化

编译就是将 高级语言 翻译为 汇编语言的过程。并且在该过程中相关优化代码。

abner@DESKTOP-M6D2HEN:~/mytest$ gcc -S test.i -o test.s
abner@DESKTOP-M6D2HEN:~/mytest$ ll
total 32
drwxrwxrwx 1 abner abner  4096 Feb  2 02:00 ./
drwxr-xr-x 1 abner abner  4096 Jan 31 23:07 ../
-rw-r--r-- 1 abner abner   122 Jan 31 23:07 test.c
-rw-r--r-- 1 abner abner 17929 Feb  2 01:58 test.i
-rw-r--r-- 1 abner abner   386 Feb  2 02:01 test.s

在这里插入图片描述

汇编

汇编将 汇编语言 转变成 机器语言,生成目标文件
每一个汇编语句几乎都对应一条机器指令。根据汇编指令和机器指令的对照表一一翻译即可。

目标文件由段组成。通常一个目标文件中至少有两个段:
代码段  该段中所包含的主要是程序的指令。该段一般是可读和可执行的,但一般却不可写。
数据段  主要存放程序中要用到的各种全局变量或静态的数据。一般数据段都是可读,可写,可执行的。

abner@DESKTOP-M6D2HEN:~/mytest$ gcc -c test.s -o test.o
abner@DESKTOP-M6D2HEN:~/mytest$ ll
total 36
drwxrwxrwx 1 abner abner  4096 Feb  2 02:02 ./
drwxr-xr-x 1 abner abner  4096 Jan 31 23:07 ../
-rw-r--r-- 1 abner abner   122 Jan 31 23:07 test.c
-rw-r--r-- 1 abner abner 17929 Feb  2 01:58 test.i
-rw-r--r-- 1 abner abner  1232 Feb  2 02:02 test.o
-rw-r--r-- 1 abner abner   386 Feb  2 02:01 test.s

在这里插入图片描述
可以看到内存分布的一些信息,代码段,数据段,bss段。堆栈是在程序的运行过程中。

连接

最后的连接阶段,将所有的 目标文件 和 需要的库连接,生成可执行文件。
链接分为静态链接和动态链接。

abner@DESKTOP-M6D2HEN:~/mytest$ gcc test.o -o test
abner@DESKTOP-M6D2HEN:~/mytest$ ll
total 44
drwxrwxrwx 1 abner abner  4096 Feb  2 02:07 ./
drwxr-xr-x 1 abner abner  4096 Jan 31 23:07 ../
-rwxr-xr-x 1 abner abner  8168 Feb  2 02:07 test*
-rw-r--r-- 1 abner abner   122 Jan 31 23:07 test.c
-rw-r--r-- 1 abner abner 17929 Feb  2 01:58 test.i
-rw-r--r-- 1 abner abner  1232 Feb  2 02:02 test.o
-rw-r--r-- 1 abner abner   386 Feb  2 02:01 test.s

参考:
https://blog.csdn.net/qq_26079093/article/details/93037468
https://blog.csdn.net/s226916240/article/details/102975171
https://blog.csdn.net/chengdanna/article/details/70767329
http://www.ha97.com/2830.html

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

c语言程序的编译过程 的相关文章

  • 使用IIS部署PHP网站

    接到通知 xff0c 需要将云服务器上的PHP网站部署到自己的Windows服务器上 反驳无效 xff0c 动手就干 0 准备工作 0 Windows Server 2012R2 1 IIS8 2 PHP CGI xff08 FastCGI
  • 崩溃的Python学习过程2——ImportError: No module named PIL(windows)

    xff08 注 xff1a win7 Ecilipse Python2 7 13 xff09 没有第三方模块问题 xff0c 在unbuntu的话直接 pip install Pillow 就可以了 xff0c 现在是Windows goo
  • 多个路由共用一个页面,路由间切换时页面刷新问题

    路由 userAudit和 userManage共用了同一个view xff0c table有selection a b c 操作五个列 xff0c userManage显示a c 操作三列 xff1b userAudit显示selecti
  • el-dialog中表单校验问题:第二次打开时会触发校验

    当required属性为变量时 xff0c rules规则应写在el form item项上 xff0c 如果写在el form上 xff0c 则第二次打开dialog时会触发校验并且显示校验结果 eg 假设有单选项type xff0c 枚
  • vue 自定义全屏组件

    1 FullScreen vue lt template gt lt span class 61 34 full screen 34 64 click 61 34 toggleFullScreen 34 gt lt span gt lt t
  • 企业微信小程序开发者登录结果不对问题

    1 调试 微信开发工具调试企业微信小程序 下载企微插件 设置 gt 扩展设置 gt 模拟器插件 gt 企业微信小程序模拟器 更改运行模式 选择企业微信小程序模式 2 账号 由于微信开发工具只能使用微信扫码登录 xff0c 所以必须使用登录微
  • python提取pdf表格数据并保存到excel(从0到1)

    win11安装python python org 下载安装包 xff08 64位操作系统 xff0c 所以选了3 7 4 windows x86 64 executable installer下载并安装 xff09 win 43 r 打开c
  • 0 Error: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by se

    nodejs连接mysql8 0 32版本报错 xff1a 0 Error ER NOT SUPPORTED AUTH MODE Client does not support authentication protocol request
  • git基本命令

    1 克隆服务器上的项目 git clone http 2 设置Git git config global user name 34 your username 34 git config global user email your ema
  • 推荐WPF的好书

    WPF好书榜 注 xff1a 以前发过一篇博文 WPF技术书籍之个人排行榜 xff0c 时隔大半年 xff0c 我又看了一些 xff0c 现向大家推荐一下其中的好书 这几本书我从头到尾都看过 xff0c 其中的示例也都一一运行分析过 xff
  • angularjs设置请求头信息

    本文部分转自 xff1a http blog csdn net magiclr article details 49643277 最近开发中遇到一个问题 xff0c 需要在模块A发出的请求头信息中添加token属性 如图所示 xff1a 简
  • angularjs 正则判断用户输入的内容只能是数字或者字母

    lt input span class hljs keyword class span 61 span class hljs string 34 form control 34 span placeholder 61 span class
  • echarts 力导向图

    首先放上大佬文章链接 xff1a http blog csdn net u010430471 article details 52955131 https www cnblogs com koala2016 archive 2016 12
  • echarts力导向图区分鼠标点击事件与拖拽事件(angularjs)

    使用echarts的力导向图做了一个知识图谱 xff0c 要求点击节点的时候 xff0c 把节点的数据作为关键词搜索 知识图谱 xff0c 以前没做过 xff0c 也不知道用什么好 xff0c 百度了一下看到有人说用echarts可以做 x
  • 2018前端笔试面试题整理

    最近好几个前端的朋友都在换工作 xff0c 根据她们的面试经验整理了一些前端笔试面试题 毕竟人少 xff0c 面的公司也少 xff0c 所以并不全面 开放性题目 xff1a 1 你在现在的团队处于什么样的角色 xff0c 起到了什么明显的作
  • docker容器网络

    在安装docker时 xff0c 会自动在host主机上创建三个网络 xff0c 用docker network ls可以进行查看 xff1a docker network ls NETWORK ID NAME DRIVER SCOPE b
  • IOS开发入门(11)-导航控制器(1)

    IOS开发入门 xff08 11 xff09 导航控制器I xff1a 层级结构和标签 前言 xff1a xff08 直接从书上抄的 xff09 大多数应用程序是由主视图导出多个屏幕 xff0c 并且通常情况下实现屏幕切换的方法还不止一种
  • IOS开发入门(12)-表视图I:基础知识

    IOS开发入门 xff08 12 xff09 表视图I xff1a 基础知识 在前面几部分中 xff0c 主屏幕只能展示一个汽车对象的信息 而在实际iOS中 xff0c 一次显示多条数据并实现滚动查看是十分常见的 xff0c 例如通讯录 音
  • C语言基础专题 - 头文件引用

    C语言基础专题 头文件引用 jcLee的个人博客 xff1a https blog csdn net qq 28550263 spm 61 1001 2101 3001 5343 邮箱 xff1a 291148484 64 163 com

随机推荐

  • Vue3 配置代理和使用全局axios请求数据

    更详细请参考 xff1a https blog csdn net qq 28550263 article details 120633610 vue3中配置全局代理和使用axios向服务器请求数据 main ts span class to
  • ros(13):ros找不到包报错及解决办法--Config.cmake

    目录 一 基础包 1 1 rospy包 1 2 tf包 1 3 grid map包 1 4 serial 二 专有包 2 1 dynamic reconfigure包 2 2 rosparam handler包 2 3 qt build包
  • 使用Java实现高效的字符串匹配算法

    摘要 xff1a 字符串匹配是计算机领域中的一个重要问题 xff0c 有着广泛的应用场景 在本篇博客文章中 xff0c 我们将介绍几种高效的字符串匹配算法 xff0c 并给出使用Java语言实现的代码示例 xff0c 希望能对读者理解和应用
  • WebDAV是什么

    WebDAV学习及使用 WebDAV是什么WebDEV怎么用各个设备连接1 Window2 MAC WebDAV是什么 基于Web的分布式编写和版本控制 xff08 WebDAV xff09 是超文本传输协议 xff08 HTTP xff0
  • 【计算机基础】整数的补码表示及负整数的左右移

    作者 xff1a LogM 本文原载于 https segmentfault com u logm articles xff0c 不允许转载 文章难免有错误之处 xff0c 请在原文评论处指出 1 补码的表示形式 计算机中整数用补码表示 举
  • Linux 获取内存页大小

    如何查看Linux系统的内存页大小 xff1a 1 getconf PAGESIZE PAGE SIZE 返回值单位为Bytes 点击 此处 折叠或打开 root 64 localhost nginx 1 8 0 getconf PAGES
  • Linux C++服务端开发教程(四) 内存泄露检查

    如何知道内存泄漏 我们如果不去特意查内存泄漏 xff0c 实际上是很难发现的 xff0c 因为这个程序即使发生内存泄漏 xff0c 他也不会有任何特征 泄漏速度不是很快 xff0c 知道某一天 xff0c 我们发现系统运行变慢了 xff0c
  • ubuntu18.04 docker开启2375远程端口

    docker开启2375端口 查询docker服务 查询docker服务 systemctl status docker service 可以看到 docker service 在 etc systemd system 目录下 xff0c
  • 【银河麒麟V10】【服务器】最小化系统安装桌面环境

    1 先制作本地镜像源 本地镜像源搭建方法可参考 xff1a 麒麟V10服务器搭建本地镜像源 https mp csdn net mp blog creation editor 120703047 2 安装桌面环境 yum grouplist
  • 第三方登录之数据库设计

    第三登录之数据库设计 现在很多网站和应用都会接入第三方登录来减少用户注册 xff0c 即方便又快捷 比如说qq登录 xff0c 微信 xff0c 新浪微博等方式 关于第三方登录数据库设计 xff0c 涉及到2张表的设计 xff0c 一张用户
  • 51单片机的定时器/计数器

    7 2 2 定时器 计数器的结构 51单片机的定时器 计数器结构如图7 7所示 T0由特殊功能寄存器TH0 TL0构成 T1由特殊功能寄存器TH1 TL1构成 T0 和T1都具有定时器和计数器两种工作模式 xff0c 4种工作方式 xff0
  • 汇编指令控制单片机LED灯

    一 点亮LED灯 简单的对P1口进行操作就可以了 代码 xff1a ORG 0000H AJMP MAIN ORG 0100H MAIN MOV P1 0FEH 点亮LED1 AJMP MAIN END 二 延时控制流水灯 延时程序生成 x
  • <数据结构> 顺序表

    目录 一 顺序表介绍 二 准备工作 1 创建顺序表 2 初始化顺序表 3 检测是否需要扩容 4 销毁顺序表 5 打印顺序表 三 四大功能 1 增加数据 头插 尾插 指定下标插入 2 删除数据 头删 尾删 指定下标删除 3 查找数据 4 修改
  • Python实现--使用微信定时每天和女友发送定制消息(附代码教程)

    但凡有些事情重复时 xff0c 我就在想怎么可以用程序来自动化 这里想分享如何每天给女友定时微信发送 晚安 xff0c 如果只是晚安 xff0c 就略显单调 xff0c 于是爬取金山词霸每日一句 xff0c 英文和翻译 xff0c 借此设定
  • 容器(ubuntu20.04)开启远程桌面rdp(显示xterm和xclock)(下)

    docker pull chanhyeok sshd ubuntu20 04 root 64 fv az844 904 tmp docker images grep sshd ubuntu20 04 chanhyeok sshd ubunt
  • Python3 函数

    1 函数 1 1函数概念 函数 function 是将具有独立功能的代码块组织成为一个整体 xff0c 使其具有特殊功能的代码集 1 2 函数的作用 使用函数可以加强代码的复用性 xff0c 提高程序编写的效率 1 3 无参数函数语法格式
  • iphone6 修改版本&&iccid解锁

    原创文章 转载请备注 https blog csdn net qq 29173507 article details 104881386 设备 xff1a iphone6卡贴机 IOS12 4 9版本 US SM运营 流程 xff1a 越狱
  • 小米空气净化器2S换pm2.5传感器风扇

    原创文章 转载请备注 https blog csdn net qq 29173507 article details 111466293 设备 小米空气净化器2s 问题 pm2 5的数值显示为0不变 传感器异常 18年年底买了一台净化器 冬
  • vscode插件的使用highlight-words

    highlight words 高亮插件 xff0c 挺好用的 插件管理的搜索框查找并安装该插件即可 插件说明也要看一下哦 原创文章 转载请备注 https blog csdn net qq 29173507 article details
  • c语言程序的编译过程

    操作系统 xff1a ubantu 工具gcc 文件 test c abner 64 DESKTOP M6D2HEN mytest cat test c include lt stdio h gt define MAXC 3 define