前言
本文对动态链接中比较重要的几个段进行分析。
正文
“.interp”段
Linux系统在执行一个可执行文件之前,要先启动动态链接器
对其完成一些动态链接相关工作,动态链接器的路径则在.interp段
中,以【链接、装载与库】动态链接初体验一文中的例子为分析对象。
输入如下指令:
objdump -s Program1
objdump用于查看可执行文件或目标文件的内容结构,-s表示打印出目标文件的所有内容
对Program1打印的结果中,.interp
段内容如下:
可以看到其内容是一段字符串,表示动态链接器的路径
/lib64/ld-linux-x86-64.so.2.
通过./Program1
指令运行Program1时,会首先启动该动态链接器完成动态链接。
“.dynamic”段
这个段保存了动态链接器在进行动态链接时所需要的基本信息,如依赖哪些共享对象、动态链接符号表的位置等。
继续对Program1可执行文件进行分析,输入如下指令:
readelf -d Program1
即可打印Program1的".dynamic"段,打印内容如下:
内容含义如下
其中的
0x0000000000000001 (NEEDED) 共享库:[./Lib.so]
表示用到了在【链接、装载与库】动态链接初体验中生成的共享对象Lib.so
0x0000000000000005 (STRTAB) 0x470
0x0000000000000006 (SYMTAB) 0x3c8
表示动态链接符号表的地址为(.dynsym)为0x470,动态链接字符串表(.dynstr)的地址为0x3c8
查看objdump -s Program1
打印的内容
.dynsym
段和.dynstr
段的起始地址都可以对应上。
动态链接符号表
Program1用到了Lib.so中的foobar()函数,foobar()是Program1的导入函数,foobar()是Lib.so的导出函数。
表示动态链接这些模块之间导入导出关系的表叫做动态符号表,“.dynsym
”。
存放动态链接相关符号名的字符串表叫做动态符号字符串表,“.dynstr
”。
以Lib.so为例,输入如下指令:
objdump -s Lib.so
打印Lib.so的二进制内容,其中
.dynsym段内容为:
.dynstr段内容为:
可以看到.dynstr段中包含字符串foobar,导出函数。
.dynsym段二进制内容不容易看,可以输入以下指令:
readelf -s Lib.so
可以看到输出.dynsym段内容如下:
其中第7行用于表示foobar
其中的1119表示函数的起始地址,40表示该函数的长度。
输入如下指令得到Lib.so的反汇编内容:
objdump -S Lib2.so
其中foobar函数部分为:
刚好可以对应上。