交叉编译内核模块报错:/bin/sh: 1: scripts/mod/modpost: not found
问题描述
使用Yocto Kirkstone自制工具链交叉编译内核模块时,报错:
/bin/sh: 1: scripts/mod/modpost: not found
工具链中仅存在modpost的源码文件(modpost.c、modpost.h)和头文件,无对应可执行程序;linux-libc-headers中也只有源码和头文件,缺失可执行文件。已在local.conf中添加kernel-modules、kernel-devsrc、kernel-dev,但modpost仍未生成。
编译日志
make ARCH=arm64 -I/opt/poky/4.0.5/sysroots/cortexa72-poky-linux/usr/include/asm -C /opt/poky/4.0.5/sysroots/cortexa72-poky-linux/lib/modules/5.15.72-yocto-standard/build M=/home/agl/Automotive/ADAS_Infotainment/project/Application/Xen modules make[1]: Entering directory '/opt/poky/4.0.5/sysroots/cortexa72-poky-linux/lib/modules/5.15.72-yocto-standard/build' arch/arm64/Makefile:36: Detected assembler with broken .inst; disassembly will be unreliable warning: the compiler differs from the one used to build the kernel The kernel was built by: gcc (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0 You are using: aarch64-poky-linux-gcc (GCC) 11.3.0 MODPOST /home/agl/Automotive/ADAS_Infotainment/project/Application/Xen/Module.symvers /bin/sh: 1: scripts/mod/modpost: not found make[2]: *** [scripts/Makefile.modpost:133: /home/agl/Automotive/ADAS_Infotainment/project/Application/Xen/Module.symvers] Error 127 make[1]: *** [Makefile:1813: modules] Error 2 make[1]: Leaving directory '/opt/poky/4.0.5/sysroots/cortexa72-poky-linux/lib/modules/5.15.72-yocto-standard/build' make: *** [Makefile:5: all] Error 2
解决建议
确认内核源码树的主机工具编译状态
kernel-devsrc仅提供内核源码,modpost这类主机端工具需要在构建内核时编译生成。检查Yocto配置中是否启用CONFIG_MODULES(可通过bitbake -e linux-yocto | grep CONFIG_MODULES确认),并重新构建内核相关包:bitbake linux-yocto -c cleansstate bitbake linux-yocto kernel-dev kernel-devsrc确保构建过程中完成了主机工具的编译。
手动编译主机端modpost工具
进入内核源码目录(即日志中的/opt/poky/4.0.5/sysroots/cortexa72-poky-linux/lib/modules/5.15.72-yocto-standard/build),执行以下命令编译主机版本的modpost:make scripts/mod/modpost注意:此工具运行在主机(x86_64)上,无需指定
ARCH或交叉编译器,使用主机原生gcc编译即可。检查kernel-dev包的完整性
kernel-dev包应包含内核构建所需的主机端工具(包括modpost)。检查sysroot下的/usr/src/kernel/scripts/mod/目录是否存在modpost可执行文件。若缺失,重新构建kernel-dev包,确保Yocto在构建阶段生成并打包了这些工具。修正交叉编译环境配置
确保主机的gcc路径被加入PATH环境变量,避免编译主机工具时误用交叉编译器。可通过echo $PATH确认主机gcc路径(如/usr/bin)在交叉编译器路径之前。处理编译器版本差异警告
日志中提示的编译器版本不一致虽非modpost缺失的直接原因,但可能引发后续模块兼容性问题。可在模块编译的Makefile中添加:IGNORE_CC_MISMATCH=1或者使用与内核编译时一致的gcc版本进行交叉编译。
内容的提问来源于stack exchange,提问作者Vipul Suneja

