1.
1.
1.
1.
什么是链接脚本
链接器主要有两个作用, 一是将若干输入文件 ( .o 文件) 根据一定规则合并为一个输 出
文件(例如 ELF 格式的可执行文件) ;一是将符号与地址绑定(当然加载器也要完成这一 部
分工作) 。关于链接器的工作机制可以参考《 Linker and Loader 》一书,本文只关心它的第 一
个功能,即如何根据一定规则将一个或多个输入文件合并成输出文件。这里的 “ 一定规则 ”
是通过链接脚本描述的。 链接器有一个编译到其二进制代码中的默认链接脚本, 大多数情 况
下使用它链接输入文件并生成目标文件。 当然, 我们也可以提供自定义的脚本以精确控制 目
标文件的格 式,如同 Linux 内核做得那样,链接器 “ - T ” 参数用于指定自定义的脚本文件。
链接脚本有自己的一套语法,本文无意对它进行过多论述,后文描述 vmlinux_32.lds.S
内容时会对内核用到的语法进行解释。 如果你希望了解完整的脚本语法, 可以阅读参考文 献
2.
2.
2.
2.
一些准备知识
说起链接器, ELF 文件格式通常是绕不开的,介绍它的文档多不胜数。 实际上, 对于 了
解链接脚本,我们完全没必要去学习 ELF 的具体格式,有一个全局的视图就足够了(当然
,
了解 ELF 格式会让事情变得轻松,你可以很轻易的将脚本中的某些元素和 ELF 格式中的 一
些字段联系起来,例如后面看到的 PHDRS 关键字就很容易和 ELF
的程序头部表关联) 。
图 1. 链接器视图 overview (摘自《 ELF 文件格式分析》 ,滕启明)
图 1 展示了从链接器的角度, 如何看待输入文件和输出文件的视图。 左边的 “ 链接视图 ”