GNU汇编程序,arm IT块错误

时间:2015-09-23 11:11:50

标签: assembly arm binutils thumb

我收到一条错误,说addeq应该在IT区块中。从我能说的是。

以下是https://github.com/Jcfunk/g3_kernel/blob/lp-release/arch/arm/crypto/aesbs-core.S_shipped

第455行的代码剪辑
    ite eq              @ Thumb2 thing, sanity check in ARM
    addeq   r6,r6,#0x10
    bne .Ldec_loop

在IT区块中是否有addeq?

从我用谷歌搜索,If-Then阻止,这个IT块意味着如果EQ然后ADDEQ否则BNE .Ldec_loop。 我觉得ADDEQ在IT区块,但我对臂装配一无所知。 或者可能是构建标志冲突。

这是make输出,make V = 1 zImage-dtb,可能问题是传递给AS的标志之一

scripts/gcc-wrapper.py gcc -Wp,-MD,arch/arm/crypto/.aesbs-core.o.d  -nostdinc -isystem /usr/lib/gcc/arm-linux-gnueabihf/5/include -I/sdcard/build/navelA/arch/arm/include -Iarch/arm/include/generated -Iinclude  -include /sdcard/build/navelA/include/linux/kconfig.h -D__KERNEL__ -mlittle-endian -Iarch/arm/mach-msm/include -D__ASSEMBLY__ -mabi=aapcs-linux -mno-thumb-interwork -funwind-tables  -D__LINUX_ARM_ARCH__=7 -mcpu=cortex-a15  -include asm/unified.h -msoft-float -gdwarf-2        -c -o arch/arm/crypto/aesbs-core.o arch/arm/crypto/aesbs-core.S

我正在使用GNU汇编程序版本2.25.1(arm-linux-gnueabihf)使用BFD版本(GNU Binutils for Ubuntu)2.25.1 gcc(Ubuntu 5.2.1-17ubuntu4)5.2.1 20150911

这是LG G3的Android内核的一部分,建立在不交叉编译的arm设备上

构建标志-nostdinc -isystem / usr / lib / gcc / arm-linux-gnueabihf / 5 / include -I / sdcard / build / navelA / arch / arm / include -Iarch / arm / include / generated -Iinclude - include ./include/linux/kconfig.h -D__KERNEL__ -mlittle-endian -Iarch / arm / mach-msm / include -Wall -DNDEBUG -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -mcpu = cortex-a15 -mtune = cortex-a15 -mfpu = neon-vfpv4 -marm -ffast-math -fsingle -precision-constant -fgcse-lm -fgcse-sm -fsched-spec-load -fforce-addr -Os -marm -fno-dwarf2-cfi-asm -fstack-protector -mabi = aapcs-linux -mno-thumb-interwork -funwind-tables -D__LINUX_ARM_ARCH __ = 7 -mcpu = cortex-a15 -msoft-float -Uarm -Wframe-larger-than = 1024 -Wno-unused-but-set-variable -fomit-frame-pointer -gdwarf-2 -Wdeclaration -after-statement -Wno-pointer-sign -fno-strict-overflow -fconserve-stack -DCC_HAVE_ASM_GOTO -munaligned-access -fforce-addr -fsingle-precision-constant -mcpu = cortex-a15 -mtune = cortex-a15 -marm -mfpu = neon-vfpv4 -fgcse-las -fpredictive-commoning

1 个答案:

答案 0 :(得分:0)

这个文件可以作为普通内核构建(ARM和Thumb)的一部分构建得很好,所以这显然是你在GCC命令行中伪造它的方式的问题。使用-E运行它以查看预处理的输出,当您在顶部附近看到此片段时,会非常清楚:

...
# 1 "include/generated/autoconf.h" 1
# 5 "./include/linux/kconfig.h" 2
# 1 "<command-line>" 2
# 1 "./arch/arm/include/asm/unified.h" 1
# 74 "./arch/arm/include/asm/unified.h"
 .macro it, cond
 .endm
 .macro itt, cond
 .endm
 .macro ite, cond
 .endm
...

这些标题显然是为了编译为ARM代码而设置的,因此这些宏隐藏了Thumb it指令,以利于可能将它们作为非ARM指令阻塞的硬件旧汇编程序(而不是忽略它们)作为一个现代统一的汇编程序应该)。因此,当你的汇编程序显然已被GCC告知发出Thumb代码时,最终会看到没有前面it的条件指令,并且可以理解地变得非常不满意。

因此,使用build命令,您需要只编译为ARM代码(传递-marm是最简单的方法)或者通过KBuild挖掘更多内容并找到必要的东西来定义以说服内核头文件他们在Thumb模式下构建“内核”(可能涉及CONFIG_THUMB2_KERNEL)。