链接这块是系统编程的一个大头,当然,csapp
至于什么是链接?我想大部分人可能和我想的一样: 只有在需要动态链接库才需要。其实,这种观点实在太片面。
csapp在本章的第一页就说明了: 链接是贯穿于程序的整个生命周期,存在于编译时(compile time),也就是将源代码转换为汇编代码; 存在于加载(load time),也就是loader加载到内存并执行;甚至存在于运行时(run time),也就是由应用程序来执行。在现代计算机系统中, 链接的工作都是由一个叫做链接器(linker)的工具完成。
7.2 静态链接
linux ld是静态链接器(static linker)以 一组可重定位目标文件和命令行参数作为输入,生成一个完全链接的、可以加载和运行的可执行目标文件作为输出。
为了构造可执行文件,链接器必须完成两个主要的任务:
符合解析(symbol resolution)
重定位(relocation)
7.3 目标文件
有三种:
-
可重定位目标文件
-
可执行目标文件
-
共享目标文件
7.4 可重定位目标文件
7.5 符号和符号表
链接器必须对这些可重定位目标文件完成两个任务:
-
符号解析
-
重定位
这里在符号解析过程中最重要的就是符号表,在介绍符号表之前,我们先说说符号的分类。
符号有4类:导出符号(export,本地符号),导入符号(import,外部符号), 静态符号(本地符号), 局部符号(本地符号,不出现在符号表中)