Ubuntu24.04下insmod报Invalid module format错误求助
内核模块插入失败:Invalid module format 问题排查与解决
问题原因
- 核心问题是模块的
.gnu.linkonce.this_module段(对应内核的struct module结构)大小与当前运行内核的结构大小不匹配,导致内核无法正确加载模块。 - 手动在Makefile中指定
CC=gcc-13破坏了内核构建系统的工具链一致性:Ubuntu官方内核编译使用的是经过定制的工具链(可能包含特定补丁或编译参数),手动指定编译器会导致模块的ABI与内核不兼容。 - 也可能是内核头文件安装不完整或
/lib/modules/$(uname -r)/build目录未正确关联到内核源码配置。
解决步骤
修正Makefile,移除手动指定的编译器
删除Makefile中的CC=gcc-13行,让内核构建系统自动调用匹配的工具链。修改后的Makefile如下:obj-m += main.o KERNELDIR ?= /lib/modules/$(shell uname -r)/build all: make -C $(KERNELDIR) M=$(PWD) modules clean: make -C $(KERNELDIR) M=$(PWD) clean gen_compile_commands: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) compile_commands.json重新安装内核相关包,确保文件完整
先卸载现有内核头文件、镜像和模块包,再重新安装:sudo apt purge linux-headers-$(uname -r) linux-image-$(uname -r) linux-modules-$(uname -r) sudo apt install linux-headers-$(uname -r) linux-image-$(uname -r) linux-modules-$(uname -r)注意:执行此操作会卸载当前运行的内核,请确保系统中有其他可用内核,或者重启后能正常进入重新安装的内核版本。
清理旧编译产物并重新编译模块
make clean make all重新尝试插入模块
sudo insmod main.ko
补充说明
内核模块的编译严格依赖内核编译时的完整环境,包括编译器版本、编译选项、内核配置等。即使内核版本号相同,不同构建环境下的内核结构体大小可能因为编译器ABI变化、内核配置差异而不同,因此必须使用内核构建系统提供的默认工具链编译模块,不能手动指定编译器。
内容的提问来源于stack exchange,提问作者horc
相关产品推荐
相关产品推荐

