说我有以下结构:
.\
|_ foo.c
|_ inc\
|_ foo_helper.c
|_ foo_helper.h
我想获得foo.ko. foo.c应#include <foo_helper.h>
。此外,带有printk
的调试消息放在foo.c init函数中,只是为了查看函数是否已加载。
我的Kbuild文件是:
obj-m := foo.o
foo-y := inc/foo_helper.o
ccflags-y := -I$(src)/inc/
编译好。 insmod
返回0
; lsmod
列出已加载的模块,但调试消息未打印在kern.log中。
#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");
#ifndef __FOO_CUSTOM_HELPER #define __FOO_CUSTOM_HELPER #include <linux/kernel.h> void foo_help_me(void); #endif /* __FOO_CUSTOM_HELPER */
#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
答案 0 :(得分:1)
我在此期间找到了解决方案:tldp.org。所需的唯一修改在Kbuild文件中,如下所示:
obj-m := fool.o fool-objs := foo.o inc/foo_helper.o ccflags-y := -I$(src)/inc/
所以我需要链接两个中介对象(foo和foo_helper)以获得第三个,最后一个,在这种情况下我称之为傻瓜