64位程序core分析

问题如下:同一套代码分别编译出32位和64位程序;32位程序在运行正常,但是64位程序运行出现coredump。

问题分析:对64位程序的coredump文件进行分析发现函数函数返回的指针被截断了。64位程序返回指针有两种情况,第一种,指针高32位全部填充0;第二种,指针高32位全部填充1,第二种情况很容易迷惑人,指针的地址怎么指向内核地址。

1.      对二进制文件进行反汇编,发现函数返回的指针确实复制给rax寄存器,但是函数返回之后,指针指向的地址就被截断了。

2.      在反汇编文件中查找,调用该函数的地方发现,在call之后,发现多了这条“cltq”汇编指令

3.      因为在调用该函数的地方没有找到对应的头文件,因此函数默认返回值用32位的整数

4.      我们在调用该函数时,指针是64位的,因此对改制进行了扩展,如果高位是1,扩展时,在高32位全部填充1,如果高位是0,扩展是,在高32位全部填充0;这就是我们在coredump文件中看到的现象

解决方法:调用该函数的文件中,添加该包含该函数声明的头文件;或者在调用该函数的文件中用extern声明该函数。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值