2011-08-28 3 views
1

ARMv5 CPU를 대상으로 APP_ABI = armeabi를 사용하여 NDK 프로젝트를 컴파일 중입니다. 부동 소수점을 처리하는 코드가 있으며 저사양 HTC Wildfire ARMv6 장치에서 실행될 때 SIGILL로 충돌이 발생하는 것을 볼 수 있습니다. 바이너리를 분해ARMv6 장치의 fpu 명령에서 Android NDK SIGILL이 충돌합니다.

는 바로 여기에 충돌

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

가 나는 APP_ABI = armeabi을 지정하면 왜 NDK는 FP 명령을 생성, EABI 호출하지 명시 적으로 네온 코드가 있어야하는데되지 않는다는 것을 보여줍니다? 문제를 해결하기 위해 mk 파일에 추가했습니다.

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

여전히 위의 바이너리 코드가 생성됩니다. 플로트 명령어가 실제로 소프트 코드를 생성하기 위해 어떤 매개 변수를 지정해야합니까? 아니면이 장치가 완전히 깨 졌는가?

>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 명령을 실행하고 출력을 게시하시기 바랍니다 다음은 CPU 정보입니다. 그렇지 않으면 컴파일 중에 사용 된 실제 컴파일러 플래그를 볼 수 없습니다.

어쨌든 -mfloat-abi=softfp 플래그는 하드웨어 부동 소수점을 의미합니다. 소프트웨어 에뮬레이션을 강제 실행하려면 -mfloat-abi=soft 옵션을 사용해야합니다.

+0

정확합니다. -mfloat-abi = softfp 플래그는 eabi_xxx 명령 대신 vldr과 같은 하드웨어 부동 소수점 바이트 코드를 생성합니다.이 명령은 이와 같은 오래된 CPU에 필요한 것입니다. 감사. – ericb