vimer linux kernel 爱好者

csapp-charter-7 链接

2021-07-01

链接这块是系统编程的一个大头,当然,csapp

至于什么是链接?我想大部分人可能和我想的一样: 只有在需要动态链接库才需要。其实,这种观点实在太片面。

csapp在本章的第一页就说明了: 链接是贯穿于程序的整个生命周期,存在于编译时(compile time),也就是将源代码转换为汇编代码; 存在于加载(load time),也就是loader加载到内存并执行;甚至存在于运行时(run time),也就是由应用程序来执行。在现代计算机系统中, 链接的工作都是由一个叫做链接器(linker)的工具完成。

7.2 静态链接

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

为了构造可执行文件,链接器必须完成两个主要的任务:

符合解析(symbol resolution)

重定位(relocation)

7.3 目标文件

有三种:

  1. 可重定位目标文件

  2. 可执行目标文件

  3. 共享目标文件

7.4 可重定位目标文件

7.5 符号和符号表

链接器必须对这些可重定位目标文件完成两个任务:

  1. 符号解析

  2. 重定位

这里在符号解析过程中最重要的就是符号表,在介绍符号表之前,我们先说说符号的分类。

符号有4类:导出符号(export,本地符号),导入符号(import,外部符号), 静态符号(本地符号), 局部符号(本地符号,不出现在符号表中)


Comments

Content