1 2 3 4

C/C++源程序到可执行程序exe的全过程

本文参考了博客,其地址如下:https://blog.csdn.net/a3192048/article/details/90143629

 

源文件生成可执行文件的过程总共是经历了预处理、编译、汇编、链接四个过程。

源程序(source code)→预处理器(preprocessor)→编译器(compiler)→汇编程序(assembler)→目标程序(object code)→连接器(链接器,Linker)→可执行程序(executables

 

 1.预处理——生成  .i  文件

主要作用:

  1. 删除 #define ,展开所有宏定义
  2. 处理条件预编译
  3. 处理#include,将头文件插入对应位置
  4. 删除所有注释
  5. 添加行号和文件标识符,用于显示调试信息:错误或警告的位置
  6. 保留 #pragma 编译器指令。设定编译器状态;指示编译器完成一些特定的动作

2.编译——生成汇编代码文件 .s

对预处理后的文件进行语法分析,词法分析,语义分析,符号汇总,然后生成 .s 文件,得到的是汇编代码。

3.汇编——生成二进制目标文件 .o

将汇编代码转成二进制文件。另外,会形成符号表,给这些符号分配虚拟地址。

4.链接——生成默认 a.out

把二进制文件链接成一个可执行的指令

链接所完成的任务是合并段表,然后把符号表合并并且对符号表进行重定位。

所谓合并段表,源代码编译生成的 a.out 会包含很多段,数据段,文本段,bss段等,编译过程中,不同的数据会对应到不同的段中, 在 .o 文件中就已经有了分段

所谓符号表合并和重定位是说最后只有一个符号表,这个符号表是由前面汇编形成的多个符号表进行合并。在这里不在同一个符号表的符号,要对他们进行重定位。

 

posted @   木木木999  阅读(1065)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示