C++之编译链接运行原理——复习笔记1(19.7.18)

阅读: 评论:0

C++之编译链接运行原理——复习笔记1(19.7.18)

C++之编译链接运行原理——复习笔记1(19.7.18)

C++编译链接运行原理

  • 编译链接
    • 预编译(生成.i文件)
    • 编译
    • 汇编
    • 链接
    • 运行
  • 虚拟地址空间布局

部分内容查看自《程序员的自我修养》

编译链接

编译链接过程分为四个部分:预编译、编译、汇编、链接。

预编译(生成.i文件)

  1. 删除#define并进行文本替换,展开所有宏定义
  2. 处理所有条件预编译指令,例#if、#ifedf、#elif、#else、#endif。
  3. 处理“include”预编译指令,将被包含的头文件插入到改预编译指令的位置。递归展开头文件(因为头文件中包含着头文件所以需要递归展开)
  4. 删除所有注释“//”"/* */"
  5. 添加行号和文件名标识,便于编译时编译器产生调试用的行号信息及用于编译时产生编译错误或警告时能够显示行号。
    6.保留所有的 #pragma编译器指令,因为编译器需要使用他们(避免头文件的重复定义)
    参考().

因为所有的宏被删除、宏定义被展开。当我们无法判断宏定义是否正确或头文件包含是否正确时,可以查看预编译后的文件来确定问题。

编译

  1. 词法分析(例:检查单词是否正确、定义变量名不能以数字开头)
  2. 语法分析(例:delete后需为指针,判断delete后的变量是否为指针)
  3. 语义分析
  4. 代码优化
  5. 生成汇编指令

汇编

翻译指令(将汇编指令转化为机器语言(二进制))

链接

  1. 合并段和符号表
  2. 符号解析(从符号引用的地方找到符号定义的地方,在符号表中处理)
  3. 分配地址和空间(建立好程序和虚拟地址空间的映射)
  4. 符号重定位(在指令段中处理)

运行

  1. 建立虚拟地址空间和物理内存的映射(内核映射的结构体)
    创建页目录和页表
  2. 加载指令和数据
  3. 入口地址写入下一行指令寄存器(CPU从下一行指令寄存器中读取指令,才能进行调用)

虚拟地址空间布局

本文发布于:2024-02-01 14:03:35,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170676741437118.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:原理   链接   笔记
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23