ELF中与动态链接相关的段

在Linux 下,动态链接器 ld.so 是一个共享对象,操作系统同样通过映射的方式将其加载到进程的地址空间中。操作系统在加载完动态链接后,将控制权交给动态链接器的入口地址,动态链接器执行一系列自身的初始化操作,而后根据当前的环境参数,对可执行文件进行动态链接工作,完成后将操作系统的控制权交给可执行文件的入口地址。

动态链接使用了很多的段信息,以下简述这些段:

1 .interp 段

动态链接器在操作系统中的位置不是由系统配置决定,也不是由环境参数指定,而是由 ELF 文件中的 .interp 段指定。该段里保存的是一个字符串,这个字符串就是可执行文件所需要的动态链接器的位置,常位于 /lib/ld-linux.so.2。(通常是软链接)


2 .dynamic 段

该段中保存了动态链接器所需要的基本信息,是一个结构数组,可以看做动态链接下 ELF 文件的“文件头”。存储了动态链接会用到的各个表的位置等信息。


3 .dynsym 段

该段与 “.symtab”段类似,但只保存了与动态链接相关的符号,很多时候,ELF文件同时拥有 .symtab 与 .synsym段,其中 .symtab 将包含 .synsym 中的符号。该符号表中记录了动态链接符号在动态符号字符串表中的偏移,与.symtab中记录对应。


4 .dynstr 段

该段是 .dynsym 段的辅助段,.dynstr 与 .dynsym 的关系,类比与 .symtab 与 .strtab 的关系


5 .hash 段

在动态链接下,需要在程序运行时查找符号,为了加快符号查找过程,增加了辅助的符号哈希表,功能与 .dynstr 类似


6 .rel.dyn 

对数据引用的修正,其所修正的位置位于 “.got”以及数据段(类似重定位段 "rel.data")


7 .rel.plt 

对函数引用的修正,其所修正的位置位于 “.got.plt”


你可能感兴趣的:(动态链接相关段)