我有问题让我的机器上build立任何内核模块。 每当我build立一个模块,modpost总是说有零个模块:
MODPOST 0 modules
为了解决这个问题,我写了一个testing模块(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
当我在我的机器上构build它时,我得到以下输出:
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的任何相关文档,但发现很less。 任何人都知道如何modpost决定要build立什么? 有没有我可能错过的环境?
顺便说一句,这是我正在运行:
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 -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.od -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
我花了一整天的时间粘在我的电脑上,为这个精确的问题而斗争,最终神秘地消失在OP上。
我可以至少从我的经验中提供这个微不足道的细节:我得到了与OP(for V = 1)相同的输出,并将打印语句放在$ {kernel_directory} /scripts/makefile.build中,表明obj-m奇怪地是NOT在包含我的makefile后设置,即使它是如上所述的明确输入。
我做了一堆与“obj-m + = hello.o”和周围的人混在一起。 最终它神奇地工作,尽管它看起来和以前一样完全一样。 也许我在线上从教程中复制了这些行,并且包含某种无效/不正确的字符?
对于任何遇到这种情况的人来说,确认obj-m实际上已经被设置为hello.o
如果它神秘不是,删除行,地狱整个Makefile,并重新键入它。
我知道这没什么帮助, 我希望我能重现发生的事情!
我刚刚遇到了同样的问题,对我来说是由于通过GREP_OPTIONS环境变量更改了默认的grep选项而导致的。 我没有深入细节,但在模块构建过程中的东西不喜欢我的替代grep输出(包括文件名和行号)。 删除GREP_OPTIONS环境变量修正了事情。
发生这种情况是因为从PDF或任何其他教程网站复制make文件内容并按原样使用它。 当你做一个复制粘贴,在Linux环境中的内容会显得有点怪异。 即; 一些特殊的人物问题将在那里。 如果您在Linux环境下重新输入内容并进行修改,则应该可以正常工作。
在另一个线程中,我发现当我复制粘贴生成文件的内容时,-C使用错误的“ – ”符号后,我不得不重新键入它。 恰好如此,上面的obj-m + = …行就是这种情况。 您需要重新输入该字符以使其有效。 希望世界各地的模块教程后面的人都能找到。
在失败的机器上,您的.config模块支持被禁用?
尝试做“make menuconfig”,并确保模块支持已启用。
我只能猜测你的内核构建环境是拙劣的,因为它通过了理论检查(开发人员的样子)以及实际测试:
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'
这个错误神秘地消失了。 如果有人有一个想法可能会导致这一点。 如果有下一次,我想知道。
我想你从一个PDF或一些HTML文件复制的Makefile的内容。 使用的连字符有点奇怪。 只要尝试在makefile中替换连字符; 它会像魅力一样工作。
尝试从Makefile中删除modules
字符串:
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
我能够通过把这个问题解决
obj-m += <module name>.o
在一个名为Kbuild的单独文件中。 请参阅Linux / documentation / kbuild / modules.txt ,了解为什么这可能起作用
我有同样的问题。 最后,我重建了内核,重写了makefile。 它终于奏效了。
我猜主要的原因是因为我有M = $(PWD)模块在下面的行之后使ARCH = ARM …