交叉编译Linux内核时自定义驱动未编译问题求助
内核驱动未被编译的问题排查
问题描述
我正在学习Linux,尝试将自行编写的简单驱动集成到内核中进行arm64架构交叉编译,但驱动未被编译——编译输出中无相关文件的编译日志,也未生成对应的驱动文件。我已将驱动添加到配置菜单,.config中已开启CONFIG_ANSWER=y,也尝试修改了文件权限,但问题依旧。同时想确认:若驱动代码存在错误,是否会在编译输出中显示?请问我哪里操作有误?
相关文件内容
drivers/misc/answer.c
#include <linux/kernel.h> #include <linux/init.h> #include <linux/module.h> /* Module Init function */ static int __init hello_world_init(void) { printk(KERN_INFO "This is the Simple Module\n"); printk(KERN_INFO "Kernel Module Inserted Successfully...\n"); return 0; } /* Module Exit function */ static void __exit hello_world_exit(void) { printk(KERN_INFO "Kernel Module Removed Successfully...\n"); } module_init(hello_world_init); module_exit(hello_world_exit); MODULE_LICENSE("GPL"); MODULE_DESCRIPTION("A simple hello world driver"); MODULE_VERSION("2:1.0");
drivers/misc/Makefile
... odj-$(CONFIG_ANSWER) += answer.o ...
drivers/misc/Kconfig
... config ANSWER tristate "Add the answer" help my module ...
.config
... # Misc devices CONFIG_ANSWER=y ...
编译命令
$ sudo make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- Image modules dtbs
问题排查与解答
最直接的错误:Makefile拼写错误
你在drivers/misc/Makefile中写的是odj-$(CONFIG_ANSWER),这是拼写错误,正确的应该是obj-$(CONFIG_ANSWER)。内核构建系统通过obj-前缀识别要编译的目标文件规则,拼写错误会导致构建系统完全忽略这条规则,所以即使CONFIG_ANSWER=y,也不会编译answer.c。关于代码错误的输出问题
如果驱动代码存在语法错误、未定义符号或其他编译错误,编译过程中会在输出中显示明确的错误信息,严重的错误甚至会直接终止编译流程。你当前的情况没有任何编译输出,说明构建系统根本没触发该文件的编译,不是代码本身的问题。其他可能的排查点
- 确认上层目录的Makefile是否包含misc子目录:检查
drivers/Makefile中是否有obj-y += misc/(内核默认会包含,但若被修改过可能影响) - 清理构建缓存后重新编译:执行
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- clean,再重新运行编译命令,避免旧缓存干扰 - 明确驱动的编译类型:当前
CONFIG_ANSWER=y表示将驱动内置到内核镜像(Image)中,不会生成单独的.ko模块文件;如果需要生成可加载模块,需将CONFIG_ANSWER设为m,此时编译后会在drivers/misc/目录下生成answer.ko
- 确认上层目录的Makefile是否包含misc子目录:检查
内容的提问来源于stack exchange,提问作者Mykola Grodskyi
相关产品推荐
相关产品推荐

