跳到主要内容

链接

基础

链接

  • 将多个代码和数据片段组合成单一文件的过程;

编译时

  • 代码翻译成机器代码然后执行;

加载时

  • 代码在执行前,被加载器加载到内存中并执行;

运行时

  • 代码在应用程序运行过程中加载到内存中并执行;

目标文件 (*.o)

  • 可重定位目标文件:可以在编译时与其他可重定位目标文件合并,生成一个可执行目标文件;
  • 可执行目标文件:可以直接复制到内存执行;
  • 共享目标文件:特殊的可重定位目标文件,可以在加载时或运行时动态加载至内存并链接;

符号和符号表

符号表
  • 位于可重定位目标模块;
  • 包括可充定额外目标模块定义和引用符号信息;
三种符号
  • 全局符号:非静态的函数和全局变量;
  • 外部符号:其他模块的全局符号;
  • 局部符号:静态的函数和全局变量,无法被其他模块引用;

静态链接

静态链接器

  • 基于一组可重定位目标文件和命令行参数;
  • 生成一个完全链接,可以加载和运行的可执行文件;

主要任务

  • 符号解析;
    • 符号:对应一个函数,变量;
    • 将符号引用和符号定义关联;
  • 重定位;
    • 合并并分配内存地址;
    • 将符号引用与内存地址关联;

可执行目标文件

可执行目标文件

  • 二进制文件;

加载可执行目标文件

  • 使用称为加载器的系统代码运行;
  • 将可执行目标文件的代码和数据从磁盘复制到内存中;
  • 跳转到程序的第一条指令或入口点运行;

动态链接共享库

静态库的缺点
  • 需要定期维护和更新;
    • 使用静态库最新版本,需要将静态库与程序重新链接;
  • 多次链接的静态库的相同代码重复复制到内存中,浪费内存空间;
共享库 (*.so) 和动态链接
  • 共享库又称为共享模块;
  • 在运行或加载时,实时加载至内存任意地址并与程序链接;
  • 该过程称为动态链接,通过动态链接器执行;
  • 允许多个进程共享内存中的相同的库代码;