9

我无法在我的机器上构建任何内核模块。每当我构建一个模块时,modpost 总是说有零个模块:

MODPOST 0 modules

为了解决这个问题,我写了一个测试模块(hello.c):

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

static int __init hello_start(void)
{
printk(KERN_INFO "Loading hello module...\n");
printk(KERN_INFO "Hello world\n");
return 0;
}

static void __exit hello_end(void)
{
printk(KERN_INFO "Goodbye Mr.\n");
}

module_init(hello_start);
module_exit(hello_end);

这是该模块的 Makefile:

obj-m = hello.o
KVERSION = $(shell uname -r)
all:
        make -C /lib/modules/$(KVERSION)/build M=$(shell pwd) modules
clean:
        make -C /lib/modules/$(KVERSION)/build M=$(shell pwd) clean

当我在我的机器上构建它时,我得到以下输出:

make -C /lib/modules/2.6.32-27-generic/build M=/home/waffleman/tmp/mod-test modules
make[1]: Entering directory `/usr/src/linux-headers-2.6.32-27-generic'
  CC [M]  /home/waffleman/tmp/mod-test/hello.o
  Building modules, stage 2.
  MODPOST 0 modules
make[1]: Leaving directory `/usr/src/linux-headers-2.6.32-27-generic'

当我在另一台机器上制作模块时,它是成功的:

make -C /lib/modules/2.6.24-27-generic/build M=/home/somedude/tmp/mod-test modules
make[1]: Entering directory `/usr/src/linux-headers-2.6.24-27-generic'
  CC [M]  /home/somedude/tmp/mod-test/hello.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /home/somedude/tmp/mod-test/hello.mod.o
  LD [M]  /home/somedude/tmp/mod-test/hello.ko
make[1]: Leaving directory `/usr/src/linux-headers-2.6.24-27-generic'

我查找了有关 modpost 的任何相关文档,但几乎没有找到。任何人都知道 modpost 如何决定构建什么?是否有我可能缺少的环境?

顺便说一句,这是我正在运行的:

uname -a
Linux waffleman-desktop 2.6.32-27-generic #49-Ubuntu SMP Wed Dec 1 23:52:12 UTC 2010 i686 GNU/Linux

编辑

这是使用 V=1 运行的 make:

make -C /lib/modules/2.6.32-27-generic/build M=/home/waffleman/tmp/mod-test modules
make[1]: Entering directory `/usr/src/linux-headers-2.6.32-27-generic'
test -e include/linux/autoconf.h -a -e include/config/auto.conf || (        \
    echo;                               \
    echo "  ERROR: Kernel configuration is invalid.";       \
    echo "         include/linux/autoconf.h or include/config/auto.conf are missing.";  \
    echo "         Run 'make oldconfig && make prepare' on kernel src to fix it.";  \
    echo;                               \
    /bin/false)
mkdir -p /home/waffleman/tmp/mod-test/.tmp_versions ; rm -f /home/waffleman/tmp/mod-test/.tmp_versions/*
make -f scripts/Makefile.build obj=/home/waffleman/tmp/mod-test
  gcc -Wp,-MD,/home/waffleman/tmp/mod-test/.hello.o.d  -nostdinc -isystem /usr/lib/gcc/i486-linux-gnu/4.4.3/include  -Iinclude  -I/usr/src/linux-headers-2.6.32-27-generic/arch/x86/include -include include/linux/autoconf.h -Iubuntu/include  -D__KERNEL__ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -m32 -msoft-float -mregparm=3 -freg-struct-return -mpreferred-stack-boundary=2 -march=i586 -mtune=generic -maccumulate-outgoing-args -Wa,-mtune=generic32 -ffreestanding -fstack-protector -DCONFIG_AS_CFI=1 -DCONFIG_AS_CFI_SIGNAL_FRAME=1 -pipe -Wno-sign-compare -fno-asynchronous-unwind-tables -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -Wframe-larger-than=1024 -fno-omit-frame-pointer -fno-optimize-sibling-calls -pg -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fno-dwarf2-cfi-asm -fconserve-stack  -DMODULE -D"KBUILD_STR(s)=#s" -D"KBUILD_BASENAME=KBUILD_STR(hello)"  -D"KBUILD_MODNAME=KBUILD_STR(hello)"  -c -o /home/waffleman/tmp/mod-test/.tmp_hello.o /home/waffleman/tmp/mod-test/hello.c
  set -e ; perl /usr/src/linux-headers-2.6.32-27-generic/scripts/recordmcount.pl "i386" "32" "objdump" "objcopy" "gcc" "ld" "nm" "" "" "1" "/home/waffleman/tmp/mod-test/hello.o";
(cat /dev/null;   echo kernel//home/waffleman/tmp/mod-test/hello.ko;) > /home/waffleman/tmp/mod-test/modules.order
make -f /usr/src/linux-headers-2.6.32-27-generic/scripts/Makefile.modpost
  scripts/mod/modpost -m -a -i /usr/src/linux-headers-2.6.32-27-generic/Module.symvers -I /home/waffleman/tmp/mod-test/Module.symvers  -o /home/waffleman/tmp/mod-test/Module.symvers -S -w  -s
make[1]: Leaving directory `/usr/src/linux-headers-2.6.32-27-generic'
waffleman@waffleman-desktop:~/tmp/mod-test$ cat /home/waffleman/tmp/mod-test/modules.order
kernel//home/waffleman/tmp/mod-test/hello.ko
4

13 回答 13

6

我花了一整天的时间盯着我的电脑来解决这个精确的问题……它最终像 OP 一样神秘地消失了。

我至少可以根据我的经验提供这个微不足道的细节:我得到了与 OP 相同的输出(对于 make V=1)并将打印语句放入 ${kernel_directory}/scripts/makefile.build 表明 obj-m 奇怪地不是在包含我的 makefile 之后进行设置,即使它已按上面的方式明确输入。

我用“obj-m += hello.o”这一行和它周围的行做了一堆鬼混。最终它神奇地起作用了……尽管它最终看起来和以前完全一样。也许我从在线教程中复制了这些行,它包含某种无效/不正确的字符?

对于遇到这种情况的任何人,请验证 obj-m 实际上是否设置为 hello.o
如果它神秘地不是,请删除该行,将整个 Makefile 搞砸,然后重新键入它。

我知道这没有多大帮助。我希望我能重现发生的事情!

于 2011-10-08T21:01:27.097 回答
2

在另一个线程中,我发现当我复制粘贴 makefile 内容时,make 后的 -C 使用了错误的“-”符号,我不得不重新输入它。碰巧这就是上面的 obj-m += ... 行的情况。您需要重新键入该字符以使其有效。希望任何遵循 hello world 模块教程的人都能找到它。

于 2015-09-19T21:31:44.867 回答
1

我猜你从 PDF 或一些 HTML 文档中复制了 Makefile 的内容。使用的连字符有点奇怪。只需尝试替换makefile中的连字符即可;它会像魅力一样起作用。

于 2012-09-22T10:05:57.237 回答
1

我刚刚遇到了同样的问题,对我来说,这是通过 GREP_OPTIONS 环境变量更改默认 grep 选项引起的。我没有深入研究细节,但模块构建过程中的某些内容不喜欢我的备用 grep 输出(包括文件名和行号)。删除 GREP_OPTIONS 环境变量可以解决问题。

于 2014-05-07T18:59:22.467 回答
1

发生这种情况是因为当您从 PDF 或任何其他教程网站复制 make 文件内容并按原样使用时。当您进行复制粘贴时,内容在 Linux 环境中会显得有些奇怪。IE; 会有一些特殊的性格问题。如果您在 Linux 环境中重新键入内容并进行 make,这应该可以工作。

于 2014-07-19T13:01:11.733 回答
0

在失败的机器上,您的 .config 是否禁用了模块支持?

尝试执行“make menuconfig”并确保启用了模块支持。

于 2011-01-17T16:50:40.387 回答
0

我只能猜测您的内核构建环境很糟糕,因为它通过了理论检查(开发人员的外观)以及实际测试:

make -C /lib/modules/2.6.36-rc8-32-desktop/build M=/dev/shm modules
make[1]: Entering directory `/usr/src/linux-2.6.36-rc8-32-obj/x86_64/desktop'
make -C ../../../linux-2.6.36-rc8-32 O=/usr/src/linux-2.6.36-rc8-32-obj/x86_64/desktop/. modules
  CC [M]  /dev/shm/hello.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /dev/shm/hello.mod.o
  LD [M]  /dev/shm/hello.ko
make[1]: Leaving directory `/usr/src/linux-2.6.36-rc8-32-obj/x86_64/desktop'
于 2011-01-17T22:14:05.160 回答
0

错误神秘地消失了。如果有人知道可能导致这种情况的原因。我想知道以防有下一次。

于 2011-03-17T14:20:16.293 回答
0

尝试modules从 Makefile 中删除字符串:

obj-m = hello.o
KVERSION = $(shell uname -r)
all:
        make -C /lib/modules/$(KVERSION)/build M=$(shell pwd) # <--
clean:
        make -C /lib/modules/$(KVERSION)/build M=$(shell pwd) clean
于 2013-09-16T14:48:36.763 回答
0

我能够通过将

obj-m += <module name>.o

在名为Kbuild的单独文件中。请参阅Linux/documentation/kbuild/modules.txt以获取有关为什么这可能有效的提示

于 2015-12-29T02:03:43.130 回答
0

我有同样的问题。最后,我重建了内核,重写了makefile。它终于奏效了。

我想主要原因是因为我在 make ARCH=arm 之后的下一行中有 M=$(PWD) 模块...

于 2016-04-24T17:34:06.373 回答
-1

我通过更正Makefile解决了这个问题,即:

obj-m := modulename.o
于 2018-05-15T12:46:18.300 回答
-1

我认为这与特殊字符无关。即使我手动输入我也无法解决!然后我再次尝试使用 kate 文本编辑器,因为我以前使用过nano,这次它甚至可以通过简单的复制和粘贴来发挥魅力。因此,我认为问题在于文本编辑器

于 2021-04-11T12:28:08.533 回答