第七章 链接

## 链接 ##

链接(linking):是将各种代码和数据部分收集起来并组合成为一个单一文件的过程。
这个文件可被加载到存储器并执行。
链接可以执行于编译时,加载时,运行时。
链接是由链接器(linker)的程序自动执行的。
链接通常是由链接器来默默处理的。理解链接器将帮助你:

  1. 构造大型程序
  2. 避免一些危险的编程错误
  3. 理解语言的作用域规则是如何实现的
  4. 理解其他的系统概念
  5. 能够利用共享库

7.1 编译器驱动程序

大多数编译系统提供编译驱动程序(compiler driver),它代表用户在需要时调用语言预处理器、编译器、汇编器和链接器。

7.2 静态链接

静态链接器(static linker):以一组可重定位目标文件和命令行参数作为输入,生成一个完全链接的可以加载和运行的可执行目标文件作为输出。
链接器完成两个主要任务:

  1. 符号解析(symbol resolution)。
  2. 重定位(relocation)。

7.3 目标文件

目标文件有三种形式:

  1. 可重定位目标文件。
    包含二进制代码和数据,其形式可以在编译时与其他可重定位目标文件合并起来,创建一个可执行目标文件。
  2. 可执行目标文件。
    包含二进制代码和数据,其形式可以被直接拷贝到存储器并执行。
  3. 共享目标文件。
    一种特殊类型的可重定位目标文件,可以在加载或者运行时被动态地加载到存储器并连接。

编译器和汇编器生成可重定位目标文件(包括共享目标文件)。链接器生成可执行目标文件。

7.4 可重定位目标文件

7.5 符号和符号表

三种不同的符号:

  1. 由m定义并能被其他模块引用的全局符号。全局链接器符号对应于非静态的C函数以及被定义为不带C static 属性的全局变量
  2. 由其他模块定义并被模块m引用的全局符号。外部符号external
  3. 只被模块m定义和引用的本地符号。本地链接器符号对应于带static属性的C函数和全局变量。

7.6 符号解析

7.7 重定位

7.8 可执行目标文件

7.9 加载可执行目标文件

7.10 动态链接共享库

7.11 从应用程序中加载和链接共享库

7.12 与位置无关的代码(PIC)

7.13 处理目标文件的工具

7.14 小结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值