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

  • 相关阅读:
    002-数据库命名开发规范
    006-多线程-基础-同步解决 概述【ReentrantLock、Semaphore、CyclicBarrier、CountDownLatch】
    005-多线程-基础-sleep、join、yield、wait、notify、notifyAll、run、start、synchronized
    004-多线程-基础-同步问题引出、同步问题解决、死锁、生产者与消费者
    003-多线程-基础-其他【命名和取得、休眠、优先级、线程状态、线程中断】
    002-多线程-基础-实现方式【thread、runnable、callale、thread和runnable对比】
    001-多线程-基础-进程线程、线程状态、优先级、用户线程和守护线程
    001-Spring在代码中获取bean的几种方式
    004-mysql explain详解
    java-序列化-001-原生介绍
  • 原文地址:https://www.cnblogs.com/xiaobingqianrui/p/9288566.html
Copyright © 2020-2023  润新知