【问题标题】:Ubuntu 15.10 (Kernel 4.2): Hello world kernel module makefile errorUbuntu 15.10(内核 4.2):Hello world 内核模块生成文件错误
【发布时间】:2016-05-24 02:05:35
【问题描述】:

我已经尝试了几个小时来创建我的第一个 Hello World 内核模块,可惜没有成功。我的简单 C 代码 (hello.c) 和 makefile 位于我系统上的 /Downloads 中,如果这很重要的话。

你好.c

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

MODULE_LICENSE("Dual BSD/GPL");

static int hello_init(void) {
    printk(KERN_ALERT "Hello, world\n");
    return 0;
}

static void hello_exit(void) {
    printk(KERN_ALERT "Goodbye, cruel world\n");
}

module_init(hello_init);
module_exit(hello_exit);

制作文件

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/4.2.0-16-generic/build
M=/home/username/workspace/test/Module modules make[1]:
Entering directory '/usr/src/linux-headers-4.2.0-16-generic'
scripts/Makefile.build:44:
/home/username/workspace/test/Module/Makefile: No such file or
directory make[2]: *** No rule to make target
'/home/username/workspace/test/Module/Makefile'.  Stop.
Makefile:1398: recipe for target
'_module_/home/username/workspace/test/Module' failed make[1]:
*** [_module_/home/username/workspace/test/Module] Error 2 make[1]: Leaving directory '/usr/src/linux-headers-4.2.0-16-generic'
makefile:4: recipe for target 'all' failed make: *** [all] Error 2

我已经尝试了几乎每一个解决方案,并遵循了可以在谷歌上找到的关于这个问题的每一个建议。没有什么能解决我的问题... 如果有人知道我可以尝试的任何事情,我将非常感激!

  • 我应该将我的 hello.c 和 makefile 移动到 /usr/src 吗?
  • 我的文件中是否有任何语法错误?
  • 是否应该在 makefile 中使用 hello.c 而不是 hello.o?
  • 我的 Ubuntu 可能缺少什么吗?
  • ...

【问题讨论】:

  • 阅读“Linux 设备驱动程序第三版”。很棒的书,还特别描述了构建过程。第 4 版即将推出!
  • 我已经阅读了前几节,但是按照说明获得了一个主线内核(我尝试了 4.3)并将其与现有内核一起安装,也没有解决我的问题。经过我今天所做的所有研究,我相信这个错误与 makefile 有某种关系......
  • 除了没有生成.ko 文件外,对我来说运行良好。
  • 它应该运行良好,因为我从您提到的书中复制了代码。如果它对你有用,那么你系统上的某些东西一定是不同的......
  • “用户名”真的是您的用户名吗?还是为了信息(不)披露而替换了真实的?

标签: c makefile kernel-module ubuntu-15.04


【解决方案1】:

我刚刚将名称“makefile”更改为“Makefile”(大写 M),这似乎起到了作用。现在我得到了:

make -C /lib/modules/4.2.0-16-generic/build M=/home/username/workspace/test/Module modules make[1]: 进入目录'/usr/src/linux-headers-4.2.0-16-generic' 建筑模块,第 2 阶段。 MODPOST 0 个模块 make[1]: 离开目录'/usr/src/linux-headers-4.2.0-16-generic'

^^ 我从一开始就知道我的 makefile 导致了这个问题!尽管如此,我仍然没有 hello.ko 文件。

有什么我现在应该尝试的建议吗?

天哪!!!

谷歌搜索了这个新问题,并从 dsf 找到了这个答案:Linux: modpost does not build anything(最后发帖)

正如他们建议的那样,我手动在 Makefile 中键入文本,然后,就像变魔术一样,它工作得非常好!现在我有了我的 hello.ko,但不幸的是,没有任何解释。也许,如果你只是从 pdf/网站复制 Makefile 文本,你最终会得到不需要的字符,就像 dsf 似乎相信的那样?!

不管怎样,问题解决了。

【讨论】:

  • Makefile 需要制表符?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-04
  • 1970-01-01
  • 1970-01-01
  • 2018-12-09
  • 1970-01-01
  • 2019-10-13
  • 2012-03-10
相关资源
最近更新 更多