WSL2下编译含Linux头文件的内核模块报错求助
WSL2下编译Linux内核模块报错解决
问题背景
尝试在Debian WSL2中编译简单内核模块,代码如下:
#include <linux/module.h> #include <linux/printk.h> int init_module(void) { printk(KERN_INFO "Hello World"); return (0); }
使用的Makefile内容:
obj-m += hello-1.c all: make -C /lib/modules/$(shell uname -r)/build=$(PWD) modules clean: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
执行编译后出现错误:
make -C /lib/modules/5.15.90.1-microsoft-standard-WSL2/build=/home/vers modules make[1]: *** /lib/modules/5.15.90.1-microsoft-standard-WSL2/build=/home/vers: No such file or directory. Stop. make: *** [Makefile:4: all] Error 2
已执行sudo apt-get install linux-headers-generic但问题未解决,后续切换到Ubuntu 20.04 WSL2后出现新错误:
make -C /home/vers/gcc/WSL2-Linux-Kernel M=/home/vers/gcc modules make[1]: *** /home/vers/gcc/WSL2-Linux-Kernel: No such file or directory. Stop. make: *** [Makefile:4: all] Error 2
解决方案
1. 修复Makefile语法错误
原Makefile的all目标中,-C参数后的路径写法错误,需先指定内核头文件/源码路径,再用M=$(PWD)指定模块源码目录。同时obj-m后应使用.o文件(规范写法),修改后的Makefile:
obj-m += hello-1.o all: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules clean: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
2. 安装WSL2对应版本的内核头文件
WSL2使用微软定制内核,不能直接用通用头文件包,需安装对应版本的头文件:
- 执行以下命令安装适配当前内核的头文件:
sudo apt update sudo apt install linux-headers-$(uname -r) - 若提示找不到包,需手动克隆对应版本的WSL内核源码:
- 查看当前内核版本:
uname -r - 克隆对应分支的内核源码:
git clone --depth 1 --branch linux-msft-wsl-$(uname -r | cut -d'-' -f3-4) https://github.com/microsoft/WSL2-Linux-Kernel.git - 进入源码目录完成预配置:
cd WSL2-Linux-Kernel zcat /proc/config.gz > .config make prepare make modules_prepare - 修改Makefile中
-C后的路径为克隆的内核源码目录,例如:all: make -C /home/vers/WSL2-Linux-Kernel M=$(PWD) modules
- 查看当前内核版本:
3. 验证并修复路径关联
执行ls /lib/modules/$(uname -r)/build,若显示路径不存在,手动创建软链接指向内核源码目录:
sudo ln -s /home/vers/WSL2-Linux-Kernel /lib/modules/$(uname -r)/build
编译验证
修改完成后执行make,若无报错会生成hello-1.ko文件,可通过以下命令加载并查看输出:
sudo insmod hello-1.ko dmesg | tail -10
内容的提问来源于stack exchange,提问作者Senna Thongthao5
相关产品推荐
相关产品推荐

