Chinaunix首页 | 论坛 | 博客
  • 博客访问: 139131
  • 博文数量: 16
  • 博客积分: 770
  • 博客等级: 上士
  • 技术积分: 212
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-31 12:25
文章分类
文章存档

2011年(1)

2010年(10)

2009年(5)

分类:

2010-09-28 07:20:34

我是在我的fedora13 x86_64上面调试的到的结果,以_slist_insert_n为例:
其中有一段代码是:
va_start(val_elemlist, t_count);
...
for(...; ...; ...)
{
    _slist_push_front_varg(pt_list, val_elemlist);
}
...
va_end(val_elemlist);
在_slist_push_front_varg(pt_list, val_elemlist)中多次使用了val_elemlist,在我的机器上val_elemlist是一个结构的指针:
val_elemlist = {gp_offset = 32, fp_offset = 48, overflow_arg_area = 0x7fff93b6bd10, reg_arg_area = 0x7fff93b6bc10}
参数保存在reg_arg_area指向的地址中,gp_offset的偏移量:
0x7fff93b6bc10:    0x93b6bc80    0x00007fff    0x00008000    0x00000000
0x7fff93b6bc20:    0x93b6def0    0x00007fff    0x00000003    0x00000002
0x7fff93b6bc30:    0x9ee63e10    0x00007fa0    0x0000000a    0x00000000
0x7fff93b6bc40:    0x00000000    0x00000000    0x01e96810    0x00000000
最开始gp_offset = 16,第一次取出的参数是有效的(蓝色字体),然后gp_offset = 24了,当第二次再取参数的时候就是无效的了,这样使用第二次取出的参数再进行计算就出现了错误。
32位系统上没有出现问题是由于va_list的实现不同,多次取参数不会导致偏移量改变,或者是根本就没有偏移量。
阅读(6404) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~