kernel编译错误R_ARM_THM_JUMP19

最近开发新的产品,需要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_entryvfp_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%

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值