问题如下:同一套代码分别编译出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声明该函数。