【问题标题】:Makefile for linux kernel module issuelinux内核模块问题的Makefile
【发布时间】:2015-10-23 22:29:39
【问题描述】:

我正在编写一个内核模块,它将成为我的中文 Arduino 的驱动程序。

我已经阅读了很多关于它的指南,其中的 Makefile 完全不同。其中一些只是不工作。我想了解如何以及为什么:)

比如我有一个简单的初学者代码:

    #define MODULE
    #define __KERNEL__

    #include <module.h> // определения для модуля 
    #include <init.h> // module_init и module_exit
    #include <kernel.h> // printk

    MODULE_AUTHOR("...");
    MODULE_DESCRIPTION("Test module for linux kernel");

    int module_start() 
    {
        printk("This is a test module startup message\n");
        return 0;
    }

    void module_stop()
    {
        printk("Module is dead\n");
        return;
    }

    module_init(module_start);
    module_exit(module_stop);

我还有一个在手册中找到的 Makefile:

    CC=gcc
    MODFLAGS:= -O2 -Wall -DLINUX
    module.o: module.c
    $(CC) $(MODFLAGS) -c module.c

所以,据我所知,我的系统使用 .ko 文件作为模块。这是第一个问题。第二个是这个makefile 不起作用。

当我制作时,我收到错误“缺少 module.h”。但我当然安装了标题。它们位于/usr/src/linux-headers-(3.2.0-4-686-pae)/usr/src/linux-headers-(3.2.0-4-common)。 *pae 目录下没有module.h,但它在*common 目录下(大部分文件都在那里)。所以,我不能用 gcc 和 makefile 编译它。

感谢您的回答。

【问题讨论】:

  • 我建议您尝试通过从命令行调用gcc 来构建模块。当它完美运行时,您可以编写一个 makefile 来自动化该过程。
  • 嗯,看起来我不知道如何正确编译它...我收到错误“缺少 module.h”。使用 gcc 编译,带有这些参数 (gcc -O2 -W -Wall -Wstrict-prototypes -Wmissing-prototypes -isystem /lib/modules/uname -r/build/include -c -o ard_module.o ard_module.c)
  • 而且,是的。我通过 apt-get install linux-headers-$(uname -r) 在 /usr/src 中安装了头文件 也许问题是我的系统是 x64 并且 gcc 试图在不同的目录中查找文件?那么,我应该怎么做才能解决它?
  • 尝试在gcc 命令中添加“-I /usr/src”。
  • 它没有帮助:c命令安装的头文件(apt-get install linux-headers-$(uname -r))在两个文件夹中:/usr/src/linux-headers-3.2 .0-4-686-pae 和 /usr/src/linux-headers-3.2.0-4-common。那么,如果你需要编译这个模块,你会使用什么命令,@Beta?

标签: c linux makefile driver kernel-module


【解决方案1】:

模块构建的“标准 Makefile”是:

obj-m    := hello-1.o

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

default:
    $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules

clean:
    rm -rf *.o *.ko *.mod.* *.symvers *.order

(从 hello-1.c 创建 hello-1.ko)

唯一使用的标头是 /lib/modules/uname -r/build/include/ 中的标头。

并且没有“module.h”:请输入#include &lt;linux/module.h&gt;(或asm/module.h)。


【讨论】:

  • 大约 1 小时前刚刚发现了 makefile 示例,它解决了我的问题。不过也非常感谢!
【解决方案2】:

我不能代表 .ko 模块问题。我不确定问题到底是什么。

但至于缺少分隔符错误,这是一个常见的 Makefile 问题。 Makefile 中的命令(下面的 $CC 行)必须以制表符开头。

要修复,只需在 $(CC) 行之前添加一个 TAB,如下所示:

CC=gcc MODFLAGS:= -O2 -Wall -DLINUX 
module.o: module.c 
      $(CC) $(MODFLAGS) -c module.c
 / \ 
  |
  | 
 TAB

【讨论】:

  • 是的,已经找到了。现在的问题更加愚蠢和困难(观看 cmets):c