高级C/C++编译技术之读书笔记(一)之编译/链接

最近有幸阅读了《高级C/C++编译技术》深受启发,该书深入浅出地讲解了构建过程(编译、链接)中的各种细节,从多个角度展示了程序与库文件或代码的集成方法,提出了面向代码复用和系统集成的软件架构设计方法,以及系统开发过程中疑难问题的解决方案。
以下将回头记录下其中的关键要点,以便后面查阅。
本节思维导图

1. 计算机体系结构抽象

2. 进程内存映射布局

(1)代码节:供CPU执行的机器指令码(.text节)
(2)数据节:供CPU操作的数据,通常来说,初始化数据(.data)、未初始化数据(.bss)、和只读数据(.rdata)会保存在分量的节中
(3)堆:动态内存分配的区域
(4)栈:为各个函数提供独立的存储空间
(5)最上层部分属于内核区域,特定进程的环境变量就存放在该区域
3. 编译阶段
编译的目的就是将高级语言转换为机器可以识别和执行的机器语言(汇编或二进制),主要过程包括:
(1)预处理:将#incldue关键字标识的含有定义的文件包含到源代码文件中、将#define语句指定的值抓换为常量、在代码中调用宏的位置将宏定义转换为代码、根据#if/#elif和#endif指令的位置包含或排除特定部分的代码
(2)语言分析:将代码转换为更易于处理的形式(删除注释和不必要的空格,以及从文本中提取符号等操作),检查程序是否满足编程语言的语法规则。包括词法、语法和语义分析
(3)汇编阶段
(4)优化阶段:将程序的寄存器使用率最小化,预测出实际上不需要执行的代码,并将其删除
(5)代码生成阶段
4. 链接阶段
连接过程的输入是目标文件的集合,其中由编译阶段预先生成,每个目标文件可以被看作单个的源代码的二进制存储版本,需要为程序内存映射提供各种各样的节(代码,初始化数据,未初始化数据,调试信息等)。连接器的最终任务是将独立的节组合成最终的程序内存映射节,与此同时解析所有的引用,为不同部分的代码间建立关联,使得程序称为一个整体。
(1)重定位:完成内存因素各行
(2)解析引用:检测拼接到程序内存映射中的节,找出哪些部分代码产生了外部调用,计算该引用的精确地址,将机器指令中的伪地址替换成程序内存映射的实际地址
高级C/C++编译技术之读书笔记(一)之编译/链接的更多相关文章
- 高级C/C++编译技术之读书笔记(二)之库的概念
最近有幸阅读了<高级C/C++编译技术>深受启发,该书深入浅出地讲解了构建过程(编译.链接)中的各种细节,从多个角度展示了程序与库文件或代码的集成方法,提出了面向代码复用和系统集成的软件架 ...
- 高级C/C++编译技术之读书笔记(三)之动态库设计
最近有幸阅读了<高级C/C++编译技术>深受启发,该书深入浅出地讲解了构建过程(编译.链接)中的各种细节,从多个角度展示了程序与库文件或代码的集成方法,提出了面向代码复用和系统集成的软件架 ...
- 高级C/C++编译技术之读书笔记(四)之定位库文件
最近有幸阅读了<高级C/C++编译技术>深受启发,该书深入浅出地讲解了构建过程(编译.链接)中的各种细节,从多个角度展示了程序与库文件或代码的集成方法,提出了面向代码复用和系统集成的软件架 ...
- 高级C/C++编译技术之读书笔记(五)之动态库版本控制
最近有幸阅读了<高级C/C++编译技术>深受启发,该书深入浅出地讲解了构建过程(编译.链接)中的各种细节,从多个角度展示了程序与库文件或代码的集成方法,提出了面向代码复用和系统集成的软件架 ...
- 深入探索Android热修复技术原理读书笔记 —— 代码热修复技术
在前一篇文章 深入探索Android热修复技术原理读书笔记 -- 热修复技术介绍中,对热修复技术进行了介绍,下面将详细介绍其中的代码修复技术. 1 底层热替换原理 在各种 Android 热修复方案中 ...
- 深入探索Android热修复技术原理读书笔记 —— 资源热修复技术
该系列文章: 深入探索Android热修复技术原理读书笔记 -- 热修复技术介绍 深入探索Android热修复技术原理读书笔记 -- 代码热修复技术 1 普遍的实现方式 Android资源的热修复,就 ...
- 深入探索Android热修复技术原理读书笔记 —— so库热修复技术
热修复系列文章: 深入探索Android热修复技术原理读书笔记 -- 热修复技术介绍 深入探索Android热修复技术原理读书笔记 -- 代码热修复技术 深入探索Android热修复技术原理读书笔记 ...
- 深入探索Android热修复技术原理读书笔记 —— 热修复技术介绍
1.1 什么是热修复 对于广大的移动开发者而言,发版更新是最为寻常不过的事了.然而,如果你 发现刚发出去的包有紧急的BUG需要修复,那你就必须需要经过下面这样的流程: 这就是传统的更新流程,步骤十分繁 ...
- Struts2技术内幕 读书笔记三 表示层的困惑
表示层能有什么疑惑?很简单,我们暂时忘记所有的框架,就写一个注册的servlet来看看. index.jsp <form id="form1" name="form ...
随机推荐
- java字节码理解-入门
前记:作为一名JAVA Developer,每次打开Eclipse,查找一个没有源码的类时,都会看到一个这样的画面: 大意是:这个jar文件,没有附带源码.紧接着后面的就看不懂了,很好奇下面的一部分是 ...
- ubuntu中在Launcher上添加Android Studio的运行图标
运行命令创建desktop文件: sudo gedit /usr/share/applications/android_studio.desktop 打开窗口后输入以下内容,注意Exec和Icon要修 ...
- SElinux 读懂.te 定义自己的 .te【转】
本文转载自:https://blog.csdn.net/kongbaidepao/article/details/61417291 一. .te 文件定义中的一些宏 1.1 unix_socket_c ...
- Linux系统下chkconfig命令使用详解
chkconfig命令可以用来检查.设置系统的各种服务 使用语法:chkconfig [--add][--del][--list][系统服务] 或 chkconfig [--level <等级代 ...
- Docker基于容器创建镜像
docker commit -m "提交信息" -a "作者信息" imgId imgName
- Codeforces Round #448 (Div. 2) B
题目描述有点小坑,ij其实是没有先后的 并且y并不一定存在于a中 判断y的个数和所给数组无关 对于2 - 7来说 中间满足%2==0的y一共有3个 2 4 6 这样 可以看出对于每个数字a 都能够二分 ...
- hibernate-Table 'XXX.XXX' doesn't exist
hibernate---Table 'XXX.XXX' doesn't exist 在设置自动生成数据表的策略中: <!-- 自动生成数据表的策略 --> <property nam ...
- Mine_hibernate
1. __z知识点\整理_归纳 ==> "ZC_归纳.txt" 和 "ZC_归纳__12_用Eclipse开发hibernate.txt" 2.
- Spring scope解惑
在2.0之前只有两种singleton和prototype(网上说的,没去验证),后面增加了session.request.global session三种专门用于web应用程序上下文的Bean Si ...
- laravel中Blade模板继承
Blade模板继承 和 区块 <!-- 文件保存于 resources/views/layouts/app.blade.php --> <html> <head> ...