我收到一条错误,说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
答案 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
)。