当前位置: 首页 > 面试题库 >

Linux:modpost不会构建任何东西

曾成天
2023-03-14
问题内容

我在将任何内核模块构建到我的机器上时遇到问题。每当我构建模块时,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

问题答案:

错误神秘地消失了。如果有人有什么想法可能会导致这种情况。我想知道是否有下次。



 类似资料:
  • 我有一个非常简单的。c文件,里面有一些明显的bug。 我试图使用clang的静态代码分析工具(scan-build)来检测错误。当我直接在文件上运行该工具时,例如使用以下命令: 扫描构建g-o 1 1.c 我确实得到了预期的输出,包括编译器发出的警告,其中提到了除以0。 scan-build:使用 '/usr/lib/llvm-3.8/bin/clang' 进行静态分析 1.c:在函数' int

  • 我至少一个月没更新任何东西了。我刚刚正常工作,突然菜单都是空白的,所以我决定重新启动eclipse。我单击“关闭”和“确定”保存所有内容,但什么也没发生,所以我再次单击“关闭”并关闭eclipse。我点击eclipse,加载屏幕只会闪烁并消失,然后出现一条消息,告诉我检查

  • 我是不是漏了什么? 这不能编译。Eclipse抱怨"Matcher Asrett类型中的方法断言(T, Matcher)不适用于参数(int, Matcher 我错过了什么东西可以用吗?我在过去使用过其他Hamcrest方法...那么这有什么不同呢?

  • 问题内容: 我有以下代码: 该文件包含以下内容: 但是由于某种原因,每次都只返回一个空列表。 代码中可能存在愚蠢的错误或错字,但我只是找不到。提前致谢。 问题答案: 你读的文件 已经 和文件指针不是在 末尾 的文件。然后调用将不会返回数据。 仅读取一次文件: 另一种选择是在重新阅读之前先回到开头: 但这只是浪费CPU和I / O时间。 最好的办法是尝试和阅读 小 数据量,或寻求到了最后,通过采取文

  • 问题内容: 当我阅读文件时,我看到 我做错什么了吗? 问题答案: 这是下面链接的博客文章的全文: 如果您最近尝试使用pip安装软件包,则可能遇到此错误: 这似乎是旧版本的OpenSSL与pip 1.3.1不兼容的问题。如果您使用的是非库存的Python发行版(特别是EPD 7.3),则很可能会设置不配合pip 1.3.1进行工作,而不会花费很多精力。 目前,最简单的解决方法是安装不需要SSL的pi

  • 我使用的是spring-boot-starter-parent版本2.0.1 这是我想要缓存结果的java方法。 我没有redis或缓存的任何其他配置。虽然它不抛出任何错误,但它不缓存任何东西。我和Redis-Cli核实了。