ric*_*chq 7 gcc thumb android-ndk
我有这个C代码:
int test(signed char anim_col)
{
if (anim_col >= 31) {
return 1;
} else if (anim_col <= -15) {
return -2;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
使用Android NDK r4b使用-Os -mthumb编译以下拇指代码:
test:
mov r3, #1
cmp r0, #30
bgt .L3
mov r3, #0
add r0, r0, #14
bge .L3
mov r3, #2
neg r3, r3
.L3:
mov r0, r3
bx lr
Run Code Online (Sandbox Code Playgroud)
但是使用最新的Android NDK r5,它会编译成这个破碎的代码:
test:
mov r3, #1
cmp r0, #30
bgt .L3
lsl r0, r0, #24
lsr r0, r0, #24
mov r3, #0
cmp r0, #127 @@ WTF?! should be <= -15 @@
bls .L3
mov r3, #2
neg r3, r3
.L3:
mov r0, r3
bx lr
Run Code Online (Sandbox Code Playgroud)
这似乎......很奇怪.如果anim_col小于0,它将返回-2而不是仅在小于或等于-15时返回-2.重现此命令的完整命令行如下:
android-ndk-r4b/build/prebuilt/linux-x86/arm-eabi-4.4.0/bin/arm-eabi-gcc -c -o test.o -Os test.c --save-temps -mthumb
和
android-ndk-r5/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc -c -o test.o -Os test.c --save-temps -mthumb
这是一个已知的GCC错误吗?我觉得很难相信,这在现实生活中不会发生!当然我的代码错了?!
从NDK r5b开始,此错误已得到修复。
与 r5 相比,此版本的 NDK 不包含任何新功能。r5b 版本解决了 r5 版本中的以下问题:
- 修复了 arm-linux-androideabi-4.4.3 工具链中的编译器错误。以前的二进制文件在处理带符号的字符时生成无效的拇指指令序列。