我在使用我的机器上构建任何内核模块时遇到问题。每当我构建一个模块时,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如何决定构建什么?是否存在我可能遗失的环境?
BTW这就是我正在运行的:
uname -a
Linux waffleman-desktop 2.6.32-27-generic #49-Ubuntu SMP Wed Dec 1 23:52:12 UTC 2010 i686 GNU/Linux
修改
这是make run with 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.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
答案 0 :(得分:5)
我花了一整天的时间粘在我的电脑上,对抗这个精确的问题......最终神秘地消失了,就像OP一样。
我至少可以从我的经验中提供这个微不足道的细节:我获得与OP相同的输出(对于make V = 1)并将print语句放在$ {kernel_directory} /scripts/makefile.build中显示obj-m奇怪的是,在包含我的makefile后没有被设置,即使它显然是如上所述。
我做了一堆愚弄“obj-m + = hello.o”和周围的那些。最终它神奇地起作用。尽管它看起来和以前完全一样。也许我已经从在线教程中复制了这些行,它包含某种无效/不正确的字符?
对于遇到此问题的任何人,请确认obj-m实际上已设置为hello.o
如果它不是神秘的,删除该行,地狱整个Makefile,并重新键入它。
我知道这没多大帮助;我希望我能重现发生的事情!
答案 1 :(得分:1)
我遇到了同样的问题,对我而言,这是由于通过GREP_OPTIONS环境变量更改默认的grep选项引起的。我没有深入研究细节,但模块构建过程中的某些内容并不像我的替代grep输出(包括文件名和行号)。删除GREP_OPTIONS环境变量修复了一些问题。
答案 2 :(得分:1)
这是因为当您从PDF或任何其他教程网站复制make文件内容并按原样使用它时。当你进行复制粘贴时,内容在Linux环境中会显得有些奇怪。即;一些特殊的角色问题将在那里。如果您在Linux环境中重新键入内容并执行make,则应该可以正常工作。
答案 3 :(得分:0)
在失败的机器上你的.config是否禁用了模块支持?
尝试执行“make menuconfig”并确保启用模块支持。
答案 4 :(得分: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'
答案 5 :(得分:0)
这个错误神秘地消失了。如果有人知道可能导致这种情况的原因。我想知道以下有时间。
答案 6 :(得分:0)
我猜你是从PDF或某些HTML文档中复制了Makefile的内容。使用的连字符有些奇怪。只需尝试替换makefile中的连字符;它会像魅力一样工作。
答案 7 :(得分:0)
尝试从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
答案 8 :(得分:0)
我能够通过
来解决这个问题obj-m += <module name>.o
在名为 Kbuild 的单独文件中。请参阅 Linux / documentation / kbuild / modules.txt 以获取有关此操作原因的提示
答案 9 :(得分:0)
我遇到了同样的问题。最后,我重建了内核,重写了makefile。它终于奏效了。
我猜主要原因是因为我在make = arm ...之后的下一行中有M = $(PWD)模块...
答案 10 :(得分:-1)
我通过纠正Makefile解决了这个问题,即:
obj-m := modulename.o
答案 11 :(得分:-1)
我认为这与特殊字符无关。即使我手动输入也无法解决!然后我再次尝试使用 kate 文本编辑器,因为之前我使用了 nano
,这次它甚至通过简单的复制和粘贴就可以发挥作用。因此,我认为问题在于文本编辑器