高级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)优化阶段:将程序的寄存器使用率最小化,预测出实际上不须要执行的代码,并将其删除blog

(5)代码生成阶段

4. 连接阶段

  链接过程的输入是目标文件的集合,其中由编译阶段预先生成,每一个目标文件能够被看做单个的源代码的二进制存储版本,须要为程序内存映射提供各类各样的节(代码,初始化数据,未初始化数据,调试信息等)。链接器的最终任务是将独立的节组合成最终的程序内存映射节,与此同时解析全部的引用,为不一样部分的代码间创建关联,使得程序称为一个总体。

  (1)重定位:完成内存因素各行

  (2)解析引用:检测拼接到程序内存映射中的节,找出哪些部分代码产生了外部调用,计算该引用的精确地址,将机器指令中的伪地址替换成程序内存映射的实际地址