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