2011-08-28 78 views
1

我正在编译一个使用APP_ABI = armeabi来定位ARMv5 cpu的NDK项目。我有处理浮点的代码,在低端的HTC Wildfire ARMv6设备上运行时,我发现我遇到了SIGILL的崩溃。Android NDK SIGILL在ARMv6设备上的fpu指令上崩溃

拆卸二进制显示,它崩溃正是这里

4397a8:  ed9f7b18  vldr d7, [pc, #96] 

为什么当我指定APP_ABI = armeabi的NDK生成FP指令,不应该是EABI电话,没有明确的霓虹灯代码?要解决我甚至已将此添加到MK文件:

LOCAL_CFLAGS := -mfloat-abi=softfp -msoft-float -mfpu=vfp 

然而,它仍然会产生上面的二进制代码。我应该指定什么参数来确保我的浮点指令实际生成软代码?或者,这个设备是否完全破碎?这里的CPU信息:

>adb shell getprop | grep abi 
[ro.product.cpu.abi]: [armeabi] 

>adb shell cat /proc/cpuinfo 
Processor  : ARMv6-compatible processor rev 2 (v6l) 
BogoMIPS  : 244.94 
Features  : swp half thumb fastmult edsp java 
CPU implementer : 0x41 
CPU architecture: 6TEJ 
CPU variant  : 0x1 
CPU part  : 0xb36 
CPU revision : 2 

Hardware  : buzz 
Revision  : 0081 
Serial   : 0000000000000000 

回答

1

请运行ndk-build -B V=1命令并发布输出。否则,我们无法在编译过程中看到真正的编译器标志。

任何方式,-mfloat-abi=softfp标志意味着硬件浮点。要强制进行软件仿真,您应该使用-mfloat-abi=soft选项。

+0

你是对的。标志-mfloat-abi = softfp生成像vldr这样的硬件浮点字节码,而不是像这样的旧CPU所需的eabi_xxx指令。谢谢。 – ericb