C语言 .ko文件在构建内核模块时没有被构建



我目前正在学习如何从'Linux设备驱动程序'书中制作内核模块。我将基本示例输入如下:

#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void)
{
printk(KERN_ALERT "Hello, worldn");
return 0;
}
static void hello_exit(void)
{
printk("Goodbye, cruel worldn");
}
module_init(hello_init);
module_exit(hello_exit);

,我使用下面的makefile来编译上面的文件hello.c

KERNELDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules

当我运行make命令时,控制台输出如下所示:

make -C /lib/modules/5.13.0-40-generic/build M=/home/finlay/src/linux-drivers modules
make[1]: Entering directory '/usr/src/linux-headers-5.13.0-40-generic'
MODPOST /home/finlay/src/linux-drivers/Module.symvers
make[1]: Leaving directory '/usr/src/linux-headers-5.13.0-40-generic'

由于某些原因,只创建以下文件:

  • .Module.symvers.cmd
  • .modules.order.cmd
  • Module.symvers
  • modules.order

所创建的文件似乎都不是专门关于hello.c文件的。非常奇怪的是,这个相同的文件最初是用来创建hello.ko文件的,但是它不再工作了。你知道为什么这不起作用吗?

我现在已经找到了解决方案,我从makefile中删除了一些行,因为我认为它们是冗余的,因为我认为它们只在您直接从内核构建目录调用makefile时使用。正确的makefile如下:

ifneq ($(KERNELRELEASE),)
obj-m := hello.o
else
KERNELDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
endif

相关内容

  • 没有找到相关文章

最新更新