【嵌入式八股10】编译和调试

C语言从源代码到可执行文件的生成过程

在C语言编程中,将源代码转化为可执行文件需要经过一系列严谨的阶段。这一过程主要包括预处理、编译、汇编和链接四个关键阶段,下面将对每个阶段进行详细阐述。

1. 预处理(Preprocessing)

预处理是整个编译流程的起始阶段,其核心任务是处理源代码里的预处理指令。预处理器会执行以下一系列操作:

  • 宏定义替换:预处理器会对所有通过 #define 定义的宏进行替换。宏定义可以让代码更具可读性和可维护性,例如:
#define PI 3.14159
// 在预处理时,代码中所有的 PI 都会被替换为 3.14159
  • 文件包含#include 指令用于引入头文件,预处理器会将这些头文件的内容原封不动地插入到包含指令所在的位置。这使得我们可以复用已有的代码,提高开发效率。比如:
#include <stdio.h>
// 预处理器会将 stdio.h 头文件的内容插入到这里
  • 条件编译:根据条件编译指令,如 #ifdef#ifndef#if#endif 等,预处理器会决定哪些代码需要被编译。这在不同平台或者不同配置下编译代码时非常有用。示例如下:
#ifdef DEBUG
    printf("Debug mode is on.\n");
#endif
  • 去除注释:预处理器会将源代码中的所有注释删除,因为注释只是为了方便程序员理解代码,对编译器来说并无实际意义。

经过预处理后,输出的是扩展后的源代码文件,通常以 .i 作为后缀。可以使用以下命令进行预处理:

gcc -E main.c -o main.i

2. 编译(Compilation)

编译阶段的主要目标是把预处理后的源代码转换为汇编代码。在这个阶段,编译器会进行以下操作:

  • 语法分析和语义分析:编译器会仔细检查代码的语法和语义是否正确。语法错误可能是拼写错误、缺少分号等,而语义错误则涉及到类型不匹配、未定义的变量等问题。只有通过这一步检查,代码才能继续进行后续的编译过程。
  • 生成中间代码:编译器会将高层次的源代码转换为低层次的中间表示。中间代码是一种介于源代码和目标代码之间的表示形式,它更接近机器语言,但又保留了一些源代码的结构信息,方便后续的优化操作。
  • 优化:编译器会对中间代码进行优化,以提高代码的执行效率。优化的方式有很多种,例如减少冗余计算、合并常量等。通过优化,可以让生成的代码在运行时更加高效。
  • 生成汇编代码:最后,编译器会将优化后的中间代码转换为对应的汇编代码。汇编代码是一种与机器指令一一对应的低级语言,便于后续的汇编过程。

编译阶段输出的是汇编代码文件,通常以 .s 作为后缀。示例命令如下:

gcc -S main.i -o main.s

3. 汇编(Assembly)

汇编阶段的任务是将汇编代码转换为机器代码,也就是目标代码。汇编器会逐行读取汇编代码,并将每条汇编指令翻译成对应的机器指令。

汇编器输出的是目标文件,通常以 .o 作为后缀。可以使用以下命令进行汇编:

gcc -c main.s -o main.o

4. 链接(Linking)

链接阶段是将一个或多个目标文件和库文件组合成一个可执行文件的过程。链接器会执行以下操作:

  • 符号解析:链接器会解析并匹配各目标文件中使用的符号(包括变量和函数)。当一个目标文件引用了另一个目标文件中定义的符号时,链接器需要找到这些符号的定义位置,确保程序能够正常运行。
  • :由于每个目标文件中的地址都是相对地址,链接器需要将这些相对地址重定位到可执行文件的绝对地址。这样,程序在运行时才能正确地访问各个内存位置。

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

嵌入式八股/模拟面试拷打 文章被收录于专栏

一些八股模拟拷打Point,万一有点用呢

全部评论
忍耐王
点赞 回复 分享
发布于 03-06 20:00 山东
编译优化选项很关键
点赞 回复 分享
发布于 03-06 00:00 北京
预处理重要性mark
点赞 回复 分享
发布于 03-04 19:21 陕西

相关推荐

头像
04-21 14:25
已编辑
河海大学 Java
20分钟&nbsp;短小精悍&nbsp;面完说过了&nbsp;约了下一面问了很多没见过的问题&nbsp;自我感受中厂的面试官能力比某些大厂的能力搞得多,很多次都是中厂面试更有收获,大厂毫无营养整体收获非常大&nbsp;问的问题都非常有营养#牛客AI配图神器# 1.自我介绍2.RAG介绍?更深入的理解?嵌入模型是什么?3.除了余弦相似度,还有什么什么算法?4.用的什么模型?多少参数?5.流式是怎么实现?有哪几种状态?流式输出客户端取消了会发生什么?6.之前deepseek使用的r1还是v3?你对他们底层的有什么理解呢?微调呢?7.温度系数是什么?topK是什么?重复出现惩罚度?8.上下文窗口了解么?超过阈值要怎么做?maxToken了解么?9.redis实现分布式锁知道么?看门狗机制说说?10.用redis做过消息队列,订阅发布试过么?11.死信队列是什么?12.Spring&nbsp;的spi有接触过么?13.哨兵机制?有没有用过lua脚本?lua脚本能做什么呢?你知道lua在集群和单机会有坑么?(真的有收获了,这才是真爱面试官)else:1.有遇到什么困难的问题么,最终解决有过么?2.平时怎么提升自己的水平么?3.我们这边的业务也有在做agent相关得项目,所以整体来看的话你还是比较合适的当场出结果是,过辣推荐我再看看大模型微调的内容,还有具体的业务细节,工作中会有帮助总体收获颇丰,问题都很有营养,面试官也很温柔细致,20分钟顶的上大厂2个小时的营养,爱---后续4.21&nbsp;我还以为是二面额&nbsp;但是说直接终面了问了些个人信息&nbsp;直接等结果了
查看15道真题和解析
点赞 评论 收藏
分享
评论
3
7
分享

创作者周榜

更多
牛客网
牛客企业服务