【问题标题】:Kernel module with included local sources包含本地资源的内核模块
【发布时间】:2013-04-13 15:35:29
【问题描述】:

假设我有以下结构:

.\
 |_ 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 返回0lsmod 将模块列为已加载,但调试消息未打印在 kern.log 中。

一个最小的例子:

  • foo.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");
  • inc/foo_helper.h:
#ifndef __FOO_CUSTOM_HELPER
#define __FOO_CUSTOM_HELPER

#include <linux/kernel.h>

void foo_help_me(void);

#endif  /* __FOO_CUSTOM_HELPER */
  • inc/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");
}
  • Kbuild:
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

【问题讨论】:

  • 如果删除 KERN_INFO 可以解决问题,请参阅 stackoverflow.com/a/4520973/26683
  • 不幸的是,事实并非如此。如果 foo_helper.* 依赖项被删除,printk() 可以正常工作。

标签: kernel header-files


【解决方案1】:

与此同时,我在tldp.org 找到了解决方案。唯一需要的修改是在 Kbuild 文件中,如下:

obj-m := fool.o
fool-objs := foo.o inc/foo_helper.o
ccflags-y := -I$(src)/inc/

所以我需要链接两个 intermediary 对象(foo 和 foo_helper)以获得第三个,最后一个,在这种情况下我称之为 fool .

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-09
    相关资源
    最近更新 更多