Ubuntu 15.10 (内核4.2):Hello world内核模块makefile错误

4

我已经试了几个小时来创建我的第一个Hello World内核模块,但遗憾的是没有成功。我的简单C代码(hello.c)和makefile位于我的系统中的/Downloads目录下,如果这有任何重要性的话。

hello.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);

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/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设备驱动程序第三版》这本书吧,它是一本非常棒的书籍,特别是描述构建过程。第四版即将推出! - cadaniluk
我已经阅读了前几个部分,但是获取主线内核(我尝试了4.3)并按照说明安装它以及现有内核一起,并没有解决我的问题。在今天进行的所有研究之后,我相信错误与makefile有关... - ci7i2en4
我的运行正常,只是没有生成.ko文件。 - cadaniluk
它应该能正常运行,因为我是从你提到的书中复制的代码。如果它对你有效,那么你系统上肯定有些不同... - ci7i2en4
“username” 真的是你的用户名吗?还是为了信息(不)披露而替换了真实的用户名? - cadaniluk
为了尝试,我再次安装了主线内核4.3rc7,现在"make"给了我以下错误:make -C /lib/modules/4.3.0-040300rc7-generic/build M=/home/username/workspace/test/Module modules make[1]: 进入目录'/usr/src/linux-headers-4.3.0-040300rc7-generic' make[1]: Makefile: 没有那个文件或目录 make[1]: *** 没有指定任何目标和没有找到 'Makefile'。 停止。 make[1]: 离开目录 '/usr/src/linux-headers-4.3.0-040300rc7-generic' makefile:4: 目标'all'的规则失败 make: *** [all] 错误 2 - ci7i2en4
1个回答

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不构建任何内容(最后发布)。
正如他们所建议的那样,我手动在Makefile中输入了文本,然后,仿佛神奇般地,它完美地运行了!现在我有了我的hello.ko,但是很遗憾,没有解释。也许,如果你只是从pdf/网站复制Makefile文本,你最终会得到不想要的字符,就像dsf所认为的那样?!无论如何,问题解决了。

1
Makefile需要使用制表符吗? - Theo Belaire

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接