在内核中构建hello world模块时出错

时间:2013-10-03 08:35:02

标签: linux linux-kernel makefile c

/*
 *  hello-1.c - The simplest kernel module.
 */

#include <linux/module.h>       /* Needed by all modules */
#include <linux/kernel.h>       /* Needed for KERN_INFO */

int init_module(void)
{
        printk(KERN_INFO "Hello world 1.\n");

        /*
         * A non 0 return means init_module failed; module can't be loaded.
         */
        return 0;
}

void cleanup_module(void)
{
        printk(KERN_INFO "Goodbye world 1.\n");
}

MAKEFILE

obj-m += hello.o

all:
        make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:
        make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

make命令后,我收到以下错误。这个错误的原因是什么,我该如何解决?

make -C /lib/modules/2.6.32-358.el6.x86_64/build M=/home/hello modules
make: *** /lib/modules/2.6.32-358.el6.x86_64/build: No such file or directory.  Stop.
make: *** [all] Error 2

2 个答案:

答案 0 :(得分:3)

make命令中的

-C选项指示将目录更改为-C提供的目录。在您的情况下,它是/lib/modules/2.6.32-358.el6.x86_64/build。但是当它尝试更改到该目录时,编译会出现“没有这样的文件或目录”的错误,这意味着您没有/lib/modules/2.6.32-358.el6.x86_64/中的构建目录。

很多时候,在给定路径中构建可能不是目录,但它可能是指向内核源代码目录的软链接。

因此,您需要检查在包含内核源的所需路径上是否应该有构建目录,或者它应该是到内核源的软链接。

答案 1 :(得分:0)

除了所有这些构建相关的注释之外,编写内核模块时必须遵循的几件事情。即使您修复了这些构建问题,您的代码也无法按预期工作。为什么?你已经构建了init和cleanup例程,但是你没有指定/指示哪一个是你的init例程,哪个是清理。

你必须这样做,

在文件末尾添加这两行。

module_init ( foo_init_fn);

module_exit ( bar_exit_fn);

此外,您必须指定模块许可证详细信息等,如下所示

MODULE_LICENSE("GPL");

MODULE_AUTHOR("Copyright (c) 2006 by xxxx xxxxx, Inc.");

MODULE_DESCRIPTION("klm_vdc");