view3
2020-12-30 11:36:24 0 举报
动态链接 函数地址
作者其他创作
大纲/内容
该函数的重要作用:1 先通过link_map来获取重定位plt表的地址(当然,也获取了符号表和字符串表的位置指针),2 然后通过第二个参数求出该函数read在重定位表中的位置指针rel,然后在访问r_info字段(重定位表结构体中的成员),里面有read在符号表中的下标位置。3 通过link_map得到的符号表地址,加上上一步得到的下标,可以得到puts在符号表中的位置指针sym。符号表也是一个结构体,他的st_name中包含read在字符串表中的偏移index。4 通过link_map得到的字符串表地址,加上index,得到符号('read')名字符串指针。这一步才真正的知道是调用的puts函数。5 在动态链接库查找这个函数的地址,并且把地址赋值给重定向表plt 中的第一个字段*rel->r_offset,即GOT表。6 最后,调用read函数。
用汇编语言写的,先保存寄存器值,然后通过栈传递参数,调用_dl_fixup函数。
GOT表中存放的是read函数的真实地址
PLT[0]
GOT表
_dl_fixup()
08048310 read@plt: 08048310: ff 25 0c a0 04 08 jmp *0x804a00c 08048316: 68 00 00 00 00 push $0x0 0804831b: e9 e0 ff ff ff jmp 8048300 第一条指令:跳转到该指针指向的地址,此时这个指针指向的地址是下一条指令的地址08048316第二条指令:reloc_arg参数进栈第三条指令:跳转到整个过程链接表的开始plt0#注意jmp *0x804a00c 这是跳到该指针指向的地址#jmp 8048300 跳到该地址处 一个是指针,一个是地址
第三条指令:跳转到整个过程链接表的开始plt0
read@plt
当一次调用函数时,GOT表中存的不是read的真实地址,而是read@plt中汇编指令的第二条指令的地址
调用read函数
第二条指令跳转
调用函数read时,先调用read@plt重定位表read@plt中有三条汇编指令
在PLT0中有两条关键的汇编指令
0 条评论
下一页