记一次CLTQ指令引起的函数返回值异常

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

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

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

2. 在反汇编文件中查找,在调用该函数的地方发现,在call指令之后,多了一条奇怪的“cltq”指令,查了查该指令的作用是对有符号数字进行扩展。

3. 为嘛会出现这个指令?因为在调用该函数的地方没有找到对应的头文件,编译器默认为函数返回值是32位数据,但我们实际使用该该函数返回值时,是当做64位处理的,因此对编译器又不得不对32位数据进行了带符号扩展——如果高位是1,扩展时,在高32位全部填充1,如果高位是0,在高32位全部填充0——这就是我们在coredump文件中看到的现象

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

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值