insmod ko invalid module format [unknown relocation]

本文探讨了在Linux版本4.14aarch32下,使用不同Makefile配置编译basic.ko模块时遇到的invalid module format错误。通过对比分析,发现错误源于R_ARM_THM_CALL重定位段的问题,与CONFIG_THUMB2_KERNEL配置和-fno-pic编译选项有关。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


linux版本4.14 aarch32

用如下出错版本的Makefile编译basic.ko,insmod ko到kernel后提示invalid module format, dmesg查看内核打印信息 basic: unknown relocation: 10

出错的版本
obj-m := basic.o
ARCH := arm 
CROSS_COMPILE := arm-linux-gnueabihf-
CC = $(CROSS_COMPILE)gcc
LD = $(CROSS_COMPILE)ld
KDIR ?= ~/source-code/x1j/build/linux-xlnx-mirror

default:
    make -C $(KDIR) M=$(shell pwd) ARCH=$(ARCH)  modules 

OK的版本
obj-m := basic.o
ARCH := arm 
CROSS_COMPILE := arm-linux-gnueabihf-
CC = $(CROSS_COMPILE)gcc
LD = $(CROSS_COMPILE)ld
KDIR ?= ~/source-code/x1j/build/linux-xlnx-mirror

default:
    make -C $(KDIR) M=$(shell pwd) ARCH=$(ARCH) CFLAGS_MODULE=-fno-pic modules 


OK的版本
obj-m := basic.o
export ARCH := arm 
export CROSS_COMPILE := arm-linux-gnueabihf-
#CC = $(CROSS_COMPILE)gcc
#LD = $(CROSS_COMPILE)ld
KDIR ?= ~/source-code/x1j/build/linux-xlnx-mirror

default:
    make -C $(KDIR) M=$(shell pwd) ARCH=$(ARCH) modules 

grep 打印信息可以查到是load_module加载ko时候对ko中的重定位段进行重定位时遇到无法处理的可重定位段时打印的错误信息

其中10 是define R_ARM_THM_CALL,且该define依赖的config  CONFIG_THUMB2_KERNEL是not set 状态,确实对比如上的不同版本build出来的basic.ko 通过查看可重定位段的信息能看到,出错的版本printk 这个符号是放在R_ARM_THM_CALL段中的

问题的原因就是kernel无法解释R_ARM_THM_CALL这个段,CFLAGS_MODULE = -fno-pic 不编译位置无关代码自然避过了这个问题,为什么export 版本的makefile 编译出来的ko就没有这个段?

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

shenhuxi_yu

感谢投币,继续输出

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值