Kernel 包含本地源的内核模块
假设我有以下结构:Kernel 包含本地源的内核模块,kernel,header-files,Kernel,Header Files,假设我有以下结构: .\ |_ foo.c |_ inc\ |_ foo_helper.c |_ foo_helper.h 我想得到福柯。foo.c应该#包括。另外,在foo.c init函数中放置一条带有printk的调试消息,以查看函数是否已加载。 我的Kbuild文件是: obj-m := foo.o foo-y := inc/foo_helper.o ccflags-y := -I$(src)/inc/ 汇编得很好insmod返回0lsmod列出已加载的模块
.\
|_ foo.c
|_ inc\
|_ foo_helper.c
|_ foo_helper.h
我想得到福柯。foo.c应该#包括。另外,在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中
一个简单的例子:
- foo.c:
- Kbuild:
- 生成文件:
同时,我在以下位置找到了解决方案:。只需在Kbuild文件中进行修改,如下所示:
因此,我需要链接两个中间对象(foo和foo_helper)以获得第三个,即最后一个,在本例中,我称之为傻瓜如果删除KERN_INFO解决了问题,请参见,不幸的是,这不是问题所在。如果删除foo_helper.*依赖项,printk()可以正常工作。
#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
obj-m := fool.o
fool-objs := foo.o inc/foo_helper.o
ccflags-y := -I$(src)/inc/