modprobe: ERROR: could not insert ‘hello‘: Exec format error

在乌班图上写了个最简单的hello驱动,交叉编译完后,上aarch64架构的开发板发现没办法安装。

在5.4.18-85-generic内核上,使用5.4.18的源码编译驱动程序,在modprobe hello时,出现了错误: 

modprobe: ERROR: could not insert 'hello': Exec format error

使用dmesg发现以下log:

hello: version magic '5.4.18 SMP mod_unload aarch64' should be '5.4.18-85-generic SMP mod_unload modversions aarch64'

解决方案:

将内核源码中的顶层Makefile文件修改为当前运行内核的版本号即可

VERSION = 5
PATCHLEVEL = 4
SUBLEVEL = 18
EXTRAVERSION = -85-generic

重新生成.config文件,编译module并modprobe即可

在加载内核模块时遇到 `modprobe: error: could not insert 'chrdevbase': Exec format error` 错误通常表明模块的二进制文件与当前运行的内核不兼容,或者模块文件本身存在格式问题。以下是一些可能的原因和解决方法: ### 原因分析 1. **模块与内核版本不兼容** 内核模块是针对特定内核版本编译的,如果模块是为另一个内核版本构建的,加载时会失败。例如,模块可能是为旧版本或不同架构的内核构建的。 2. **模块文件损坏或格式错误** 模块文件(`.ko` 文件)可能已损坏,或者未正确编译,导致其格式无法被内核识别。 3. **交叉编译问题** 如果模块是在不同的架构或平台上编译的,可能会导致模块文件格式不符合当前系统的预期。 4. **缺少模块签名或签名验证失败(适用于启用模块签名的系统)** 某些系统启用了模块签名验证,如果模块未正确签名或签名不匹配,加载将被拒绝。 --- ### 解决方法 #### 1. 确保模块是为当前内核编译的 使用以下命令检查当前运行的内核版本: ```bash uname -r ``` 然后确认模块是否是为该内核版本构建的。如果不是,请重新编译模块: ```bash make -C /lib/modules/$(uname -r)/build M=$(pwd) modules ``` #### 2. 检查模块文件是否存在并具有正确的格式 使用 `file` 命令检查 `.ko` 文件的格式: ```bash file chrdevbase.ko ``` 正常情况下,输出应类似于: ``` chrdevbase.ko: Linux kernel module ELF 64-bit LSB relocatable, x86-64, ... ``` 如果输出显示文件不是有效的 ELF 文件或格式异常,则模块文件可能已损坏或未正确编译。 #### 3. 使用 `modinfo` 检查模块信息 运行以下命令查看模块的详细信息: ```bash modinfo chrdevbase.ko ``` 如果模块信息无法显示或报错,说明模块文件存在问题。 #### 4. 确保模块未被签名或签名正确(适用于启用模块签名的系统) 如果系统启用了模块签名验证,可以使用以下命令检查模块签名: ```bash modinfo chrdevbase.ko | grep -i signature ``` 如果没有输出或显示签名不匹配,则需要重新签名模块或禁用模块签名验证(不推荐用于生产环境)。 #### 5. 禁用模块签名验证(仅限测试) 如果怀疑是签名问题,可以尝试在内核启动参数中添加: ``` module.sig_enforce=0 ``` 编辑 `/etc/default/grub` 文件,修改 `GRUB_CMDLINE_LINUX` 添加上述参数: ```bash GRUB_CMDLINE_LINUX="module.sig_enforce=0" ``` 然后更新 GRUB 配置和 initramfs: ```bash sudo update-grub sudo update-initramfs -u ``` 重启后再次尝试加载模块。 --- ### 示例:重新编译并加载模块 假设模块源文件为 `chrdevbase.c`,执行以下步骤: ```bash make clean make -C /lib/modules/$(uname -r)/build M=$(pwd) modules sudo insmod chrdevbase.ko ``` 如果一切正常,模块应成功加载。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值