最近开发新的产品,需要5.10.x的内核来支撑新的需求,在编译的时候出现下面的错误无法完成内核的编译:
arch/arm/vfp/vfphw.o: in function `vfp_support_entry':(.text+0xa): relocation truncated to fit: R_ARM_THM_JUMP19 against symbol `vfp_kmode_exception' defined in .text.unlikely section in arch/arm/vfp/vfpmodule.o
最终在linux内核官方patchwork找到了对应的BUG描述以及解决方法:
根据官方的说法,是因为vfphw.o内部调用了函数vfp_support_entry,vfp_support_entry内部又调用了函数vfp_kmode_exception,而vfp_kmode_exception所在的地址使用THUMB2指令集是跳转不过去的---因为THUMB2指令能使用的立即数范围比较小。
方法1 直接在内核中禁止THUMB2指令集:
在xxx_defconfig中注释掉:#CONFIG_THUMB2_KERNEL=y
重新编译即可
方法2 在文件 /arch/arm/vfp/vfphw.S汇编文件中加入红色那一行的代码,如下所示:
同时在内核中正常使能THUMB2指令集:
在xxx_defconfig中加入:CONFIG_THUMB2_KERNEL=y
ENTRY(vfp_support_entry)
ldr r3, [sp, #S_PSR] @ Neither lazy restore nor FP exceptions
and r3, r3, #MODE_MASK @ are supported in kernel mode
teq r3, #USR_MODE
THUMB( it ne )
bne vfp_kmode_exception @ Returns through lr
VFPFMRX r1, FPEXC @ Is the VFP enabled?
重新编译即可
两种方法编译都可以正常通过且正常运行
区别体现在方法1所编译的内核要比方法2所编译的内核大200KB左右,因为THUMB2指令集的作用就是在性能损失极小的情况下大幅度增加指令密度,根据官方的说法,THUMB2指令集比ARM指令集的指令密度高30%的同时能达到ARM指令集性能的98%。