《深入理解计算机系统》读书笔记(七)链接

前言

继续阅读《深入理解计算机系统》这本经典书籍
本节是第七章
链接

1、编译器驱动程序

链接:将各种代码和数据片段收集并组合成为一个单一文件的过程

一个例子
《深入理解计算机系统》读书笔记(七)链接
其静态链接过程
链接器完成主要任务:

  • 符号解析:每个符号引用和一个符号定义关联
  • 重定位:把每个符号定义和一个内存位置关联,修改对应的符号引用
    《深入理解计算机系统》读书笔记(七)链接
    动态链接过程
    《深入理解计算机系统》读书笔记(七)链接

2、目标文件

三种形式

  • 可重定位目标文件:编译器和汇编器形成,二进制代码+数据,可以在编译时相互合并,创建可执行目标文件
  • 可执行目标文件:链接器形成,二进制代码+数据,可以复制到内存并执行
  • 共享目标文件:特殊的可重定位目标文件,可以动态加载进内存并链接

可重定位目标文件

一个典型的ELF可重定位目标文件
《深入理解计算机系统》读书笔记(七)链接
各节

  • .text:已编译程序的机器代码
  • .rodata:只读数据
  • .data:初始化的全局和静态C变量
  • .bss:未初始化或初始化为0的全局和静态C变量
  • .symtab:程序中定义和引用的函数和全局变量的信息
  • .rel.text: .text节中位置的列表
  • .tel.data.:被引用或定义的所有全局变量的重定位信息
  • .debug:调试符号表
  • .line:源程序的行号和.text中机器代码之间的映射
  • .strtab:字符串表

可执行目标文件

可执行目标文件加载到内存中如下
《深入理解计算机系统》读书笔记(七)链接

3、符号

每个可重定位目标模块m都有一个符号表
在链接器中有三种符号
《深入理解计算机系统》读书笔记(七)链接
对全局符号的解析很棘手
若有多重定义
编译器在输出时有强弱之分

  • 强符号:函数和初始化的全局变量
  • 弱符号:未初始化的全局变量

链接器处理规则:

  • 不允许有多个同名强符号
  • 一强多弱则选强
  • 多弱则随机选一个
  • 多强则报错

4、重定位

《深入理解计算机系统》读书笔记(七)链接

结语

了解链接的过程

  • 主要是三种文件
  • 符号解析和重定位
  • 静态动态链接