有关于x86_64体系结构下地址无关代码的生成问题

mazinkaiser1991 2016-03-06 03:04:14
最近在看《程序员的自我修养》,动手实验了一下地址无关代码的生成方式。动态链接库的代码如下:

#include <stdio.h>
static int glob;
void foobar()
{
int a = 2;
glob = 1;
printf("Printing from Lib.so %d\n",glob);
sleep(-1);
}

对于模块内部的数据访问,我生成的汇编代码是

72f: c7 05 0b 09 20 00 01 movl $0x1,0x20090b(%rip) # 201044 <glob>
736: 00 00 00
739: 8b 05 05 09 20 00 mov 0x200905(%rip),%eax # 201044 <glob>

以上两个地址都是glob的地址,使用gdb运行程序,查看rip的值与glob的值,结果
第一个地址处的值为0x7ffff7dd8032,第二个地址处的值为0x7ffff7dd8036。glob的地址为0x7ffff7dd803c。
所以我的问题就是三个地址均不相同,请问前两个地址是如何定位到glob的?
...全文
237 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
nswcfd 2016-03-10
  • 打赏
  • 举报
回复
不客气。:)
nswcfd 2016-03-09
  • 打赏
  • 举报
回复
第一个mov指令10个字节(c7 05 0b 09 20 00 01 00 00 00,楼主的贴出的反汇编写到两行里去了),所以Offset的值是rip+10+0x20090b 第二个mov指令6个字节(8b 05 05 09 20 00),offset的值是rip+6+0x200905
mazinkaiser1991 2016-03-09
  • 打赏
  • 举报
回复
引用 3 楼 nswcfd 的回复:
这里的%rip是指gbd单步运行到某个指令的时候,寄存器rip的值? 注意它们跟目标之间的差值: 第一条:0x7ffff7dd803c-0x7ffff7dd8032 = 10 第二条:0x7ffff7dd803c-0x7ffff7dd8036 = 6 再数数每个指令的长度(字节数) :)
不好意思,晚辈愚钝。您能不能说的再直白一点,还是不太理解您想表达的意思
mazinkaiser1991 2016-03-09
  • 打赏
  • 举报
回复
引用 6 楼 nswcfd 的回复:
第一个mov指令10个字节(c7 05 0b 09 20 00 01 00 00 00,楼主的贴出的反汇编写到两行里去了),所以Offset的值是rip+10+0x20090b 第二个mov指令6个字节(8b 05 05 09 20 00),offset的值是rip+6+0x200905
非常感谢,解决我一个大问题
nswcfd 2016-03-08
  • 打赏
  • 举报
回复
hint:概念上可以这么理解,cpu完成解码之后,pc/rip已经更新为下一条指令的地址了。
nswcfd 2016-03-08
  • 打赏
  • 举报
回复
这里的%rip是指gbd单步运行到某个指令的时候,寄存器rip的值? 注意它们跟目标之间的差值: 第一条:0x7ffff7dd803c-0x7ffff7dd8032 = 10 第二条:0x7ffff7dd803c-0x7ffff7dd8036 = 6 再数数每个指令的长度(字节数) :)
nswcfd 2016-03-07
  • 打赏
  • 举报
回复
这是基于rip的相对偏移,两条指令的rip不同,引用同一个地址的相对偏移肯定也就不同了。 PS, 0x....8032和0x...8036是什么地址?
mazinkaiser1991 2016-03-07
  • 打赏
  • 举报
回复
引用 1 楼 nswcfd 的回复:
这是基于rip的相对偏移,两条指令的rip不同,引用同一个地址的相对偏移肯定也就不同了。 PS, 0x....8032和0x...8036是什么地址?
您说的这一点我通过分析汇编大概看懂了, 0x....8032是0x20090b+(%rip)的结果,0x...8036是0x200905+(%rip)的结果,这两个地址应该是指向glob的地址,也就是0x7ffff7dd803c。但我的程序运行到这里的时候,这两个地址都没有指向0x7ffff7dd803c。所以我想请问您,您是否知道为什么?

4,438

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧