C语言真正的编译过程

2023-05-16

说实话,很多人做了很久的C/C++,也用了很多IDE,但是对于可执行程序的底层生成一片茫然,这无疑是一种悲哀,可以想象到大公司面试正好被问到这样的问题,有多悲催不言而喻,这里正由于换工作的缘故,所以打算系统的把之前用到的C/C++补一补。这里权且当做抛砖引玉,大神飘过。

【总述】

从一个源文件(.c)到可执行程序到底经历了哪几步,我想大多数的人都知道,到时到底每一步都做了什么,我估计也没多少人能够说得清清楚楚,明明白白。

其实总的流程是这样的。

【第一步】编辑hello.c


1 #include <stdio.h>
2 #include <stdlib.h>
3 int main()
4 {
5         printf("hello world!\n");
6         return 0;
7 }  

【第二步】预处理

预处理过程实质上是处理“#”,将#include包含的头文件直接拷贝到hell.c当中;将#define定义的宏进行替换,同时将代码中没用的注释部分删除等

具体做的事儿如下:

(1)将所有的#define删除,并且展开所有的宏定义。说白了就是字符替换

(2)处理所有的条件编译指令,#ifdef #ifndef #endif等,就是带#的那些

(3)处理#include,将#include指向的文件插入到该行处

(4)删除所有注释

(5)添加行号和文件标示,这样的在调试和编译出错的时候才知道是是哪个文件的哪一行

(6)保留#pragma编译器指令,因为编译器需要使用它们。

 

gcc -E hello.c -o a.c可以生成预处理后的文件。通过查看文件内容和文件大小可以得知a.c讲stdio.h和stdlib.h包含了进来。

【第三步】编译

编译的过程实质上是把高级语言翻译成机器语言的过程,即对a.c做了这些事儿

(1)词法分析,

(2)语法分析

(3)语义分析

(4)优化后生成相应的汇编代码

从 高级语言->汇编语言->机器语言(二进制)

gcc -S hello.c -o a.s可以生成汇编代码

汇编代码如下。


 1         .file   "hello.c"
 2         .section        .rodata
 3 .LC0:
 4         .string "hello world!"
 5         .text
 6         .globl  main
 7         .type   main, @function
 8 main:
 9 .LFB0:
10         .cfi_startproc
11         pushl   %ebp
12         .cfi_def_cfa_offset 8
13         .cfi_offset 5, -8
14         movl    %esp, %ebp
15         .cfi_def_cfa_register 5
16         andl    $-16, %esp
17         subl    $16, %esp
18         movl    $.LC0, (%esp)
19         call    puts
20         movl    $0, %eax
21         leave
22         .cfi_restore 5
23         .cfi_def_cfa 4, 4
24         ret 
25         .cfi_endproc
26 .LFE0:
27         .size   main, .-main
28         .ident  "GCC: (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3"
29         .section        .note.GNU-stack,"",@progbits  

gcc -c hello.c -o a.o将源文件翻译成二进制文件。类Uinx系统编译的结果生生成.o文件,Windows系统是生成.obj文件。

编译的过程就是把hello.c翻译成二进制文件

【第四步】链接

就像刚才的hello.c它使用到了C标准库的东西“printf”,但是编译过程只是把源文件翻译成二进制而已,这个二进制还不能直接执行,这个时候就需要做一个动作,

将翻译成的二进制与需要用到库绑定在一块。打个比方编译的过程就向你对你老婆说,我要吃雪糕。你只是给你老婆发出了你要吃雪糕的诉求而已,但是雪糕还没有到。

绑定就是说你要吃的雪糕你的老婆已经给你买了,你可以happy。

gcc hello.c -o a可以生成可执行程序。即gcc不带任何参数。ldd就可以看到你的可执行程序依赖的库。

可以看到a.o的大小是1.1k,毕竟他只是把源文件翻译成二进制文件。a却有7k,应该是他多了很多“绳子”吧。在运行的时候这些“绳子”就将对应的库函数“牵过来”。很形象的比喻是不是?哈哈。libc.so.6 中就对咱们用的printf进行了定义。

这就是编写的整个流程,(⊙o⊙)。谢谢各位看官。不足的地方请不吝赐教。

转载于:https://www.cnblogs.com/wuyouxiaocai/p/5701088.html

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

C语言真正的编译过程 的相关文章

  • vue 指定index.html,在vue中,v-for的索引index在html中的使用方法

    在vue中 v for的索引index在html中的使用方法 如下所示 xff1a 以上这篇在vue中 v for的索引index在html中的使用方法就是小编分享给大家的全部内容了 xff0c 希望能给大家一个参考 xff0c 也希望大家
  • windows10 ubuntu子系统 WSL文件位置

    windows10 的linux子系统 xff08 windows subsystem for linux WSL 文件位置 以我的系统为例 xff0c WSL的root目录对应windows的 xff1a C Users xiaoPeng
  • CrawlSpiders简介

    转 xff1a https www cnblogs com ellisonzhang p 11124516 html 4295547 一 CrawlSpiders类简介 通过下面的命令可以快速创建 CrawlSpider模板 的代码 xff
  • python网络协议

    一 互联网的本质 咱们先不说互联网是如何通信的 发送数据 xff0c 文件等 xff0c 先用一个经典的例子 xff0c 给大家说明什么是互联网通信 现在追溯到八九十年代 xff0c 当时电话刚刚兴起 xff0c 还没有手机的概念 xff0
  • 通过css 改变通过img标签引入的svg颜色

    前言 修改svg颜色 xff0c 一般直接修改文件的svg的fill属性就可以了 xff0c 可以直接改svg属性 xff0c 也可以通过css修改 xff0c 但是前端一般都是通过img标签直接引入的svg图片 xff0c 这样不管是从后
  • Linux环境下vs code中Markdown与PlantUML联合工作

    PlantUML是一个可以让你快速编写UML图的组件 在线服务器 https www plantuml com plantuml uml SyfFKj2rKt3CoKnELR1Io4ZDoSa70000 Markdown是一种轻量级标记语言
  • FPGA到底是什么

    做FPGA设计这么久 xff0c 每次给别人介绍的时候 xff0c 总是感觉讲的不够深刻 xff0c 惭愧惭愧惭愧 这次 xff0c 我就FPGA的硬件属性来展开 xff0c 简单写写 xff0c 与大家分享 我的许多朋友都是经验丰富的算法
  • 一个玩游戏的失足青年,转行做游戏开发到教育的挣扎过程

    14年的IT从业经历 xff0c 中专毕业后在小镇上开过网吧 在网吧一年多的时间里 xff0c 天天陪人玩游戏 xff0c 后来去读了一个三流计算机专业 xff0c 毕业后转做软件开发 xff0c 最近五年转入游戏开发行业 xff01 从网
  • 电路设计基础--MOS管驱动直流电机电路,看懂芯片手册

    本例以驱动继电器为例 xff0c 来讲述相关电路设计 xff0c MOS管选型 xff0c 以及看懂芯片手册 驱动电路如下图 D1作用是泄放继电器的反向电动势 继电器参数 24V继电器 电大负载25A 250VAC xff0c 线圈电阻64
  • linux下 /usr/bin/ld: 找不到 -ldhnetsdk的解决方法

    linux下使用Qt编译程序的时候 xff0c 安装了程序自带的链接库之后 xff0c 仍然上报这个错误 xff0c 发现系统上报这个错误 xff1a usr bin ld 找不到 ldhnetsdk 经过仔细的定位 xff0c 终于解决了
  • 无人机--飞控科普

    无人机是无人驾驶飞机的简称 xff08 Unmanned Aerial Vehicle xff0c UAV xff09 xff0c 是利用无线电遥控设备和自备的程序控制装置的不载人飞机 xff0c 包括无人直升机 固定翼机 多旋翼飞行器 无
  • 远程桌面使用双屏或多屏

    选项 显示 将所有监视器用于显示 查了半天居然没有靠谱答案 xff0c 自己动手发现 转载于 https www cnblogs com phoenix p 4294103 html
  • 问题记录:未设置为接受端口“文件和打印机共享(SMB)”上的连接

    解决办法 xff1a 网络 xff08 右击 xff09 属性 本地连接 xff08 右击 xff09 属性 此连接使用下列选项 Microsoft网络的文和打印共享 xff08 打上勾 xff09 转载于 https www cnblog
  • arduino 语音音箱 :语音控制、MP3播放、报时、回复温湿度情况

    arduino 语音音箱 xff1a 语音控制 MP3播放 报时 回复温湿度情况 效果图 线路图 包装后的效果 功能 需要材料 arduino板MP3播放模块及喇叭时钟模块温湿度模块语音识别模块面包板及其他线材 电阻TF卡 xff08 用于
  • 通过多张网卡发送UDP多播(组播)数据

    在具有多个网卡的机器上 xff0c 如果想要从每个网卡发送UDP数据 xff0c 一般的做法是 xff1a 针对每张网卡的每个IP都绑定一个SOCKET xff0c 然后发送的时候针对每个SOCKET都发送一次 但是如果你要发送多播数据 x
  • 常见的HTTP状态码

    本内容摘抄自RESTful WebServices 中文译本附录B 39 42种常见的HTTP响应代码 39 原文作者 xff1a Leonard Ricbardson amp Sam Ruby 翻译 xff1a 徐涵 李红军 胡伟 1 三
  • ps快速切图

    妈呀 xff0c 不得不感慨一下 xff0c 切了这么久的图 xff0c 竟然不知道有个切图工具这么好用 以前我的切图流程 xff1a 拿到ui设计好的psd文件 61 61 gt 拉基准线 61 61 gt 切片工具切图 61 61 gt
  • MongoDB v4.0 命令

    MongoDB v4 0 命令 官方文档 gt 点这里 lt 操作系统库 操作管理员库 use admin 鉴权 db auth 34 root 34 34 admin 34 用户查看 格式美化 db system users find p
  • 查看端口是否可访问(防火墙拦截处理)

    telnet ip 端口 例如 xff1a telnet 10 20 113 15 8080 出现 Escape character is 表示连接 xff0c 没有被防火墙拦截 转载于 https www cnblogs com kdx

随机推荐

  • ESP32-CAM上手

    硬件 ESP32 CAM摄像头开发板 安信可科技 ESP32 CAM摄像头开发板 https item taobao com item htm spm 61 a1z09 2 0 0 67002e8dvbTVMF amp id 61 6159
  • 面试时如何做好5分钟自我介绍?

    有简历 xff0c 为何还要自我介绍 xff1f 一个常规的面试 xff0c 寒暄之后面试官提出的第一个问题几乎千篇一律 xff1a 请您简单地做一下自我介绍 有些被面试者都会问 xff1a 简历中情况已经写得很清楚了 xff0c 这是否多
  • windows查看当前python的版本

    1 Ctrl 43 R打开控制台 输入python之后回车 转载于 https www cnblogs com CK85 p 10243904 html
  • 利用MATLAB绘制置信区域

    lt MATLAB小技巧之二十四 xff1a 利用MATLAB绘制置信区域 gt 统计中经常会遇到求置信区间 置信区域 xff08 如置信椭圆 置信椭球 xff09 等 xff0c 有时候需要把置信区域画出来 xff0c 这样看起看更为直观
  • 关于latex编译中文不显示问题的解决方法。

    我的编译环境是texlive2018 43 texstudio 配置如图 默认编码格式为utf8 直接上代码 documentclass article usepackage xeCJK documentclass UTF8 ctexart
  • 最新百度 阿里 华为 腾讯 谷歌面试笔试题及解析 (转)

    原文地址 xff1a http m blog csdn net blog panfengyun12345 12618453 8月15日 xff0c 百度2道面试题 xff1a 1 来自 编程之美 的概率题 xff1a 一个桶里面有白球 黑球
  • 归并排序——C语言

    归并排序 归并排序 xff08 MERGE SORT xff09 是建立在归并操作上的一种有效的排序算法 该算法采用经典的分治 xff08 divide and conquer xff09 策略 xff08 分治法将问题分 divide 成
  • Linux设备驱动程序学习(19)-USB 驱动程序(四)

    编写 USB 驱动程序 xff08 本部分的一些示例源码来自drivers usb usb skeleton c xff0c 它是Linux内核为我们提供的最基础的USB驱动程序 xff0c USB骨架程序 xff09 驱动程序把驱动对象注
  • Linux----面试

    1 tcp和udp的区别 TCP xff1a 是面向连接的流传输控制协议 xff0c 具有高可靠性 xff0c 确保传输数据的正确性 xff0c 有验证重发机制 xff0c 因此不会出现丢失或乱序 UDP xff1a 是无连接的数据报服务
  • ssh免密码登陆失败的原因

    今天因为需要在两台服务器上进行ssh免登陆 xff0c 所以安装网上的教程 xff0c ssh keygen t rsa xff0c 然后把相互的密钥加入到对方的authorized keys 问题是我们虽然这样做了 xff0c 却一直要密
  • ESP32-s2芯片esp32-s2-saola-1开发板 micropython的repl连接

    本文只是解决通过esp32 s2 saola 1开发板 自带microUSB 作为repl与micro python通信的问题 如果你对esp32 xff0c micropython不熟 xff0c 本文不适合你 如果你用的不是esp32
  • 机械臂模拟2.0

    机械臂模拟 void MobileCrane updateHopeLength int center x int center y int center z int armNodeNum int ropePitchNum int baseN
  • Qt获取时间戳作为图片名

    Qt获取时间戳作为图片名 保存图片 void SaveRealsenseImg QString picIndexName 61 dataSavePath picIndexName append 34 34 获取当前时间 QDateTime
  • [转&精]IO_STACK_LOCATION与IRP的一点笔记

    IO STACK LOCATION和IRP算是驱动中两个很基础的东西 xff0c 为了理解这两个东西 xff0c 找了一点资料 1 IRP可以看成是Win32窗口程序中的消息 xff08 Message xff09 xff0c DEVICE
  • wireshark抓包结果很多[TCP Retransmission]怎么办?

    有一同事问用wireshark抓包时发现很多 TCP Retransmission xff0c 这些包极大影响了自己真正想看的http数据包 xff0c 如下图 我拿到pcapng后首先看到这些包的来源ip都是固定的两个 xff0c 所以首
  • MATLAB神经网络训练结果各参数解释

    最上面的图形显示的是神经网络的结构图 xff0c 可知有一个隐层一个输出层 第二部分显示的是训练算法 xff0c 这里为学习率自适应的梯度下降BP算法 xff1b 误差指标为MSE 第三部分显示训练进度 xff1a Epoch xff1a
  • SQL语句统计个数大于一的记录

    1 主要是利用Having语句进行 xff0c 由于where不能与聚合函数一起使用 xff0c 所以用having SELECT MC COUNT MC AS SL FROM JSB GROUP BY MC HAVING COUNT MC
  • You must give at least one requirement to install (see "pip help install")

    语言 python why install 后面没有参数 xff0c 也就是说没有给想要安装的包 way pip install 后面要跟想要安装的包名 转载于 https www cnblogs com 2bjiujiu p 902966
  • VHDL乘除法及转换

    首先鄙视一下这个不智能的语言 1 要进行乘法与除法 xff0c 数据类型必须是signed 2 两个16位的数相乘 xff0c 结果必须是32位的 3 乘以2的n次幂的数可以直接乘 xff0c 之后截位也比较方便 xff0c xff08 其
  • C语言真正的编译过程

    说实话 xff0c 很多人做了很久的C C 43 43 也用了很多IDE xff0c 但是对于可执行程序的底层生成一片茫然 xff0c 这无疑是一种悲哀 xff0c 可以想象到大公司面试正好被问到这样的问题 xff0c 有多悲催不言而喻 x