假设我有以下结构:
.\
|_ foo.c
|_ inc\
|_ foo_helper.c
|_ foo_helper.h
我想获取 foo.ko。foo.c 应该#include <foo_helper.h>
。此外,在 foo.c init 函数中放置了一条调试消息printk
,只是为了查看该函数是否已加载。我的 Kbuild 文件是:
obj-m := foo.o
foo-y := inc/foo_helper.o
ccflags-y := -I$(src)/inc/
编译良好。insmod
返回0
;lsmod
将模块列为已加载,但调试消息未打印在 kern.log 中。
一个最小的例子:
- 富.c:
#undef __KERNEL__ #define __KERNEL__ #undef MODULE #define MODULE #include <linux/module.h> // included for all kernel modules #include <linux/kernel.h> // included for KERN_INFO #include <foo_helper.h> static int __init foo_init(void) { printk(KERN_INFO "Foo inserted successfully.\n"); foo_help_me(); return 0; } static void __exit foo_exit(void){} module_init(foo_init); module_exit(foo_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR("Foo"); MODULE_DESCRIPTION("Bar");
- 公司/foo_helper.h:
#ifndef __FOO_CUSTOM_HELPER #define __FOO_CUSTOM_HELPER #include <linux/kernel.h> void foo_help_me(void); #endif /* __FOO_CUSTOM_HELPER */
- 公司/foo_helper.c:
#include "foo_helper.h" void foo_help_me(void) { printk(KERN_INFO "We're inside the helper, seems to be working.\n"); }
- 构建:
obj-m := foo.o foo-y := inc/foo_helper.o ccflags-y := -I$(src)/inc
- 生成文件:
ifneq ($(KERNELRELEASE),) include Kbuild else KDIR := /lib/modules/`uname -r`/build default: $(MAKE) -C $(KDIR) M=$$PWD modules endif