树莓派4编译内核模块遇Exec format error问题求助(交叉编译内核)
问题分析与解决
根本原因
- 架构不兼容导致fixdep无法执行:你的内核是在x86服务器交叉编译生成的,编译内核过程中生成的
scripts/basic/fixdep是x86架构的可执行文件。树莓派4采用aarch64(ARM64)架构,无法直接运行x86二进制程序,因此出现Exec format error。 - 编译器版本不匹配:内核由Debian 10的
aarch64-linux-gnu-gcc 10.2.1编译,而你当前在树莓派上使用Ubuntu的gcc 11.2.0编译模块。虽然这只是警告,但编译器版本差异可能导致模块与内核的ABI(应用二进制接口)不兼容,引发潜在的加载或运行问题。
解决方法
方法一:在树莓派上重新编译内核辅助工具
进入内核头文件目录,重新编译scripts目录下的所有工具,生成适配aarch64架构的版本:
cd /usr/src/linux-headers-5.15.65-rt49-preemptrt-full-raspi make scripts
完成后回到模块目录,重新执行编译命令:
make -C /lib/modules/$(uname -r)/build M=/home/ubuntu/dont-trace modules
方法二:在x86服务器上交叉编译模块
利用x86服务器上已有的交叉编译链,直接编译出适配aarch64的模块,再拷贝到树莓派加载:
# 在x86服务器上执行 make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -C /path/to/your/kernel/source M=/path/to/dont-trace modules
将编译生成的dont_trace.ko文件通过scp或其他方式拷贝到树莓派,使用insmod dont_trace.ko加载模块。
方法三:匹配内核编译的编译器版本
在树莓派上安装与内核编译版本一致的gcc,避免ABI不兼容问题:
sudo apt update sudo apt install gcc-10
编译模块时指定使用gcc-10:
make CC=gcc-10 -C /lib/modules/$(uname -r)/build M=/home/ubuntu/dont-trace modules
此方法建议配合方法一使用,彻底解决工具链和架构的双重问题。
内容的提问来源于stack exchange,提问作者yenWu
相关产品推荐
相关产品推荐

