为linux内核生成简单hello world模块的.ko文件时出错

时间:2014-07-12 03:36:06

标签: c linux linux-kernel makefile

我是linux内核开发的初学者,并试图在linux中加载一个简单的模块。 我创建了一个hello.c文件,作为内核模块加载。

#include <linux/module.h>  
#include <linux/kernel.h>  
#include <linux/init.h>    

MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("A Simple Hello World module");

static int __init hello_init(void)
{
    printk(KERN_INFO "Hello world!\n");
    return 0;   
}

static void __exit hello_cleanup(void)
{
    printk(KERN_INFO "Cleaning up module.\n");
}

module_init(hello_init);
module_exit(hello_cleanup);

这个hello.c和makefile都是,我保存在/ home / linux /目录下。

生成文件

obj-m +=hello.o

src= /usr/src/linux-headers-3.5.0-17-generic
all:
  $(MAKE) -C $(src) SUBDIR-$(PWD) modules
clean:
  rm -rf *.o *.ko

生成.ko文件,当我从/ home / linux目录运行终端上的make命令时,出现以下错误

h2o@h2o-Vostro-1015:~/linux$ make
make -C /usr/src/linux-headers-3.5.0-17-generic SUBDIR-/home/h2o/linux modules
make[1]: Entering directory `/usr/src/linux-headers-3.5.0-17-generic'
make[1]: *** No rule to make target `SUBDIR-/home/h2o/linux'.  Stop.
make[1]: Leaving directory `/usr/src/linux-headers-3.5.0-17-generic'
make: *** [all] Error 2

请告知我错过了什么或做错了什么..

3 个答案:

答案 0 :(得分:1)

  • 生成文件

      

    obj-m:= hello.o#Module Name是hello.c

         

    KDIR:= / lib / modules / $(shell uname -r)/ build

         

    全部:$(MAKE)-C $(KDIR)M = $(PWD)模块

         

    清洁:$(MAKE)-C $(KDIR)M = $(PWD)清洁$(RM)Module.markers   modules.order

不能保证头文件总是位于/ usr / src目录中,但肯定会位于/ lib / modules目录中。

  • 确保系统具有最新的头文件

找出要存在的头文件 跑'

  

uname -r

在终端上,输出就像

  

3.5.0-17-generic

安装头文件运行

  

sudo apt-get install linux-headers-$(uname -r)

答案 1 :(得分:0)

你有:

$(MAKE) -C $(src) SUBDIR-$(PWD) modules

但似乎你想要:

$(MAKE) -C $(src)/SUBDIR-$(PWD) modules

或类似的东西;源代码在哪里生活?你需要-C那里。

答案 2 :(得分:0)

内核构建系统有点复杂。阅读kernel build process文档会很好。这样可以更好地理解

  • 目标如--- modules / modules_install
  • 像--- -C $KDIR / M=$PWD
  • 这样的选项
  • 命令语法---
  • $ make -C <path_to_kernel_src> M=$PWD

    $ make -C /lib/modules/ uname -r /build M=$PWD

    $ make -C /lib/modules/ uname -r /build M=$PWD modules_install

  • 可加载模块目标--- obj-m

等...