Assembly GNU汇编程序,arm IT块错误

Assembly GNU汇编程序,arm IT块错误,assembly,arm,binutils,thumb,Assembly,Arm,Binutils,Thumb,我得到一个错误,说addeq应该在IT块中。据我所知是这样的 下面是代码的一部分,在第455行 addeq是否在IT块中 根据我在谷歌上搜索到的,If-Then块,这个IT块意味着If-EQ-Then-ADDEQ-else BNE.Ldec_循环。 我觉得ADDEQ在IT领域,但我对arm组装一无所知。 或者可能是生成标志冲突 这里是make输出,make V=1 zImage dtb,问题可能是传递给AS的标志之一 scripts/gcc-wrapper.py gcc -Wp,-MD,arch

我得到一个错误,说addeq应该在IT块中。据我所知是这样的

下面是代码的一部分,在第455行

addeq是否在IT块中

根据我在谷歌上搜索到的,If-Then块,这个IT块意味着If-EQ-Then-ADDEQ-else BNE.Ldec_循环。 我觉得ADDEQ在IT领域,但我对arm组装一无所知。 或者可能是生成标志冲突

这里是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版本(用于Ubuntu的GNU Binutils)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/include/linux/kconfig.h-D_u-KERNEL_u-mlittle-endian-Iarch/arm-msm/include-Wall-DNDEBUG-Wundef-wstrigraphs-fn-wstrigraphs-fno严格别名-fno-common-Werror隐式函数声明-Wno格式安全性-fno删除空指针检查-mcpu=cortex-a15-mtune=cortex-a15-mfpu=neon-vfpv4-marm-ffast数学-F单精度常数-fgcse lm-fgcse sm-fsched规范加载-fforce addr-Os-marm-fno-dwarf2-cfi-asm-fstack保护器-mabi=aapcs linux-mno thumb互通-funwind表格-D__LINUX_ARM_ARCH_=7-mcpu=cortex-a15-msoft float-Uarm-Wframe大于=1024-Wno未使用但设置变量-fomit frame pointer-gdwarf-2-WDECARATION after语句-Wno指针符号-fno严格溢出-FCONSERVERVE堆栈-DCC_有ASM_GOTO-munaligned访问-fforce addr-fsingle精度常量-mcpu=cortex-a15-mtune=cortex-a15-marm-mfpu=neon-vfpv4-fgcse las-fppredictive commoning

此文件作为正常内核构建的一部分(包括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
...
。。。
#1“包含/生成/自动确认”1
#5.“/include/linux/kconfig.h”2
# 1 "" 2
#1.“/arch/arm/include/asm/unified.h”1
#74.“/arch/arm/include/asm/unified.h”
.宏它,康德
.endm
.宏itt,康涅狄格州
.endm
.康涅狄格州
.endm
...
这些头文件显然是为编译为ARM代码而设置的,因此这些宏隐藏了Thumb
it
指令,这有利于那些可能会将其作为非ARM指令阻塞的老汇编程序(而不是像现代统一汇编程序应该忽略的那样)。因此,当您的汇编器(显然是被GCC告知要发出拇指代码)最终看到没有前面的
it
的条件指令时,它会变得非常不高兴,这是可以理解的


因此,使用build命令,您要么只需要编译为ARM代码(传递
-marm
是最简单的方法),要么进一步深入KBuild,找到需要定义的内容,以使内核头确信它们正在以Thumb模式构建“内核”(可能涉及
CONFIG\u THUMB2\u kernel
).

自从您发布问题以来,行数似乎已移动到448?无论如何,对我来说,代码看起来是正确的
addeq
位于
ite
块内,
bne
也是
ite
块的一部分。请尝试在第74行
.code 32
上方插入一个
#错误“错误的体系结构”
,以检查它是否实际生成为thumb2。@PacMan--关于行号,您是对的。我链接的文件是旧版本。它由一个perl脚本组成。我更新了Openssl,但没有提交。这本应该是对前面相同问题的编辑,但它仍然没有所有必要的信息:命令行的路径在计算机以外的任何地方都不起作用(我猜有一些替代),我们不知道
gcc wrapper.py
做了什么,这些依赖于内核配置的自动生成头的确切状态是什么,或者您使用的是什么版本的GCC,以及它是如何配置的(这实际上是这里的关键因素之一)。然而,碰巧的是,我今天似乎感觉到了足够的精神和足够的宽容…@不太正确,也许应该说这是针对Android内核的。
...
# 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
...