跳到主要内容

链接与目标文件

链接是什么?​

  • 定义: 把多个代码和数据片段组合成单一文件的过程;
  • 编译时链接: 源代码翻译成机器代码后立即链接;
  • 加载时链接: 程序被加载器加载到内存时链接;
  • 运行时链接: 应用程序运行过程中才链接;
  • 好处: 支持分离编译, 修改一个模块只需重新编译该模块;

目标文件有哪几种?​

类型用途
可重定位目标文件可在编译时与其他可重定位目标文件合并
可执行目标文件可以直接复制到内存执行
共享目标文件可在加载时或运行时动态加载到内存并链接

符号和符号表是什么?​

  • 符号表: 位于可重定位目标模块中, 记录本模块定义和引用的符号信息;
  • 全局符号: 非静态的函数和全局变量;
  • 外部符号: 其他模块定义的全局符号;
  • 局部符号: 静态函数和静态全局变量, 不能被其他模块引用;

静态链接器的主要任务是什么?​

  • 符号解析: 把每个符号引用关联到唯一的符号定义;
  • 重定位: 合并各个节并分配运行时地址, 再把符号引用改为指向该地址;

可执行目标文件怎样被加载运行?​

  • 形式: 二进制文件;
  • 加载器: 一段系统代码, 把可执行文件的代码和数据从磁盘复制到内存;
  • 启动: 跳转到入口点, 即程序的第一条指令;

静态库有什么缺点?​

  • 维护成本: 静态库更新后, 使用它的程序必须重新链接才能用上新版本;
  • 空间浪费: 多个程序链接同一静态库时, 相同代码在内存中被重复复制;

共享库和动态链接解决什么问题?​

  • 共享库: 又称共享模块, 是一种特殊的可重定位目标文件;
  • 动态链接: 在加载时或运行时把共享库加载到内存的任意地址并与程序链接, 由动态链接器完成;
  • 收益: 多个进程可以共享内存中同一份库代码, 且库更新后无需重新链接程序;