【问题标题】:Linux modules version error "Invalid module format"Linux 模块版本错误“无效的模块格式”
【发布时间】:2015-08-01 05:13:57
【问题描述】:

我制作了 Linux 外部模块,因为我的模块需要 Linux 内核符号,

我设置了 Modversion 配置并制作它。(也制作了 modules_install)

我的模块完全是在 lib/modules/(my linux)/extra/ 中制作的

但是当我插入我的模块时,shell 会打印错误消息

insmod: ERROR: could not insert module oxen_aggregator_module.ko: Invalid module format

这是 dmesg 内容

[  341.458351] oxen_aggregator_module: version magic '3.17.8-gentoo-r1 SMP mod_unload modversions ' should be '3.17.8-gentoo-r1 SMP mod_unload '

但我需要 modversions 标志,因为如果我没有设置该标志,Module.symvers 只有 0x00000000 个地址。

你能帮帮我吗?我该如何解决?

我的 Make 文件

SRCS    = oxen_aggregator_module.c
OBJS    = $(SRCS:.c=.o)

obj-m += $(OBJS)

KBUILD_EXTRA_SYMBOLS={/usr/src/linux-$(shell unamr -r)/Module.symvers}
all:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules_install
clean:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
    $(RM) Module.markers modules.order

【问题讨论】:

  • 通常,在更改版本后,整个内核都应该重建(makemake modules_installmake install在顶级源目录)。
  • @Tsyvarev 我也做了同样的事情,但没有解决。还有其他解决方案吗?
  • stackoverflow.com/a/30332639/3440745 所述拆分 Makefile 并删除 KBUILD_EXTRA_SYMBOLS 指令:内核的 Module.symvers 文件将自动使用。然后,清理完模块目录后,尝试重建模块。顺便说一句,您的模块没有放在内核树中,是吗?
  • 是的,我的模块没有放在内核树中,但是我需要使用内核函数,所以我要引用内核的符号表! @Tsyvarev
  • 再一次,KBUILD_EXTRA_SYMBOLS 只需要用于来自其他模块的符号内核之外。你不需要特殊的方法来使用来自内核核心和随它提供的模块的符号。

标签: linux module kernel insmod


【解决方案1】:

您尝试将模块加载到内核中,但尚未为其构建它(模块)。或者您为一个内核构建模块,但使用 KBUILD_EXTRA_SYMBOLS 和为另一个内核创建的Module.symvers 文件。

如果您需要将 KBUILD_EXTRA_SYMBOLS 与内核的 Module.symvers file 一起使用,那么它肯定会在某处与不同的内核混淆。

【讨论】:

  • 那么,如何将我的模块从外部插入内核树以使用导出的内核符号?或者有关于外部模块编程的任何解释吗?谢谢
  • 只编译模块,使用没有 KBUILD_EXTRA_SYMBOLS 的 Makefile。内核符号集,可用于外部模块,不依赖于 modversion 配置。
猜你喜欢
  • 2021-08-18
  • 1970-01-01
  • 2016-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-30
  • 2016-01-12
  • 1970-01-01
相关资源
最近更新 更多