簡體   English   中英

Linux:modpost 不構建任何東西

[英]Linux: modpost does not build anything

我在讓任何內核模塊在我的機器上構建時遇到問題。 每當我構建一個模塊時,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

我整天盯着我的電腦解決這個精確的問題......最終像 OP 一樣神秘地消失了。

我至少可以從我的經驗中提供這個微不足道的細節:我得到了與 OP 相同的輸出(對於 make V=1)並將打印語句放在 ${kernel_directory}/scripts/makefile.build 中表明 obj-m 奇怪地不是在包含我的 makefile 后進行設置,即使它已明確鍵入如上。

我對“obj-m += hello.o”及其周圍的行進行了一些鬼混。 最終它神奇地起作用了......盡管它最終看起來和以前完全一樣。 也許我從在線教程中復制了這些行並且它包含某種無效/不正確的字符?

對於遇到此問題的任何人,請確認 obj-m 實際上已設置為 hello.o
如果它神秘地不是,請刪除該行,刪除整個 Makefile,然后重新鍵入。

我知道這沒有多大幫助; 我希望我能重現發生的事情!

在另一個線程中,我發現當我復制粘貼 makefile 內容時,make 后面的 -C 使用了錯誤的“-”符號,我不得不重新輸入它。 碰巧上面的 obj-m += ... 行就是這種情況。 您需要重新鍵入該字符以使其有效。 希望任何遵循 hello world 模塊教程的人都能找到它。

我猜你是從 PDF 或一些 HTML 文檔中復制了 Makefile 的內容。 使用的連字符有些奇怪。 只需嘗試替換 makefile 中的連字符; 它會像魅力一樣工作。

我剛剛遇到了同樣的問題,對我來說這是由於通過 GREP_OPTIONS 環境變量更改默認 grep 選項引起的。 我沒有深入研究細節,但模塊構建過程中的某些內容不喜歡我的備用 grep 輸出(包括文件名和行號)。 刪除 GREP_OPTIONS 環境變量可以解決問題。

發生這種情況是因為當您從 PDF 或任何其他教程網站復制 make 文件內容並按原樣使用時。 在進行復制粘貼時,內容在 Linux 環境中會顯得有些奇怪。 即; 會有一些特殊的字符問題。 如果您在 Linux 環境中重新鍵入內容並進行 make,這應該可以工作。

嘗試從 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。 它終於奏效了。

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

在出現故障的機器上,您的 .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'

錯誤神秘地消失了。 如果有人知道可能導致這種情況的原因。 如果有下次,我想知道。

我通過更正 Makefile 解決了這個問題,即:

obj-m := modulename.o

我認為這與特殊字符無關。 即使我手動輸入也無法解決! 然后我再次嘗試使用 kate 文本編輯器,因為以前我使用的是nano ,這次它甚至通過簡單的復制和粘貼就可以發揮作用。 因此,我認為問題在於文本編輯器

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM