跨编译内核模块:无效的模块格式。

4

我正在尝试使用以下规格交叉编译helloworld内核模块:

  • 主机:intel x86 32位,linux-3.0.0
  • 目标:ARM机器(Parrot AR.Drone),linux-2.6.27.47

我正在使用以下makefile:

PWD := $(shell pwd)
obj-m := test.o
all:
    $(MAKE) -C /path/to/kernel M=$(PWD) CROSS_COMPILE=arm-none-linux-gnueabi- ARCH=arm  modules

其中 arm-none-linux-gnueabi- 是 arm 工具链的前缀。

作为内核,我尝试使用来自 git://github.com/CyanogenMod/cm-kernel.git 的克隆作为内核。这是一个 2.6 内核分支。使用此内核,编译成功。但在尝试插入模块时,会出现错误:

invalid module format

很遗憾,这句话的意思不是很清楚。

2
如果插入模块时出现“无效模块格式”错误以及其他错误,系统日志可能包含更多信息。可以使用 dmesg 显示日志。 - Eugene
2个回答

7
感谢Eugene提供使用dmesg的提示,我找到了错误:
version magic '2.6.37.6 mod_unload modversions ARMv5 ' should be '2.6.27.47-parrot preempt mod_unload ARMv5 '

结论:编译内核模块时,不仅需要匹配版本,还需要匹配一些配置参数。我的问题是通过使用正确的版本和编辑配置解决的。
如果您不想重新配置所有内容,一个快速(丑陋的)修复方法是编辑include/generated/autoconf.h

1

我丑陋的修复方案是修改脚本文件"scripts/setlocalversion"

170         if test "${LOCALVERSION+set}" != "set"; then
171                 scm=$(scm_version --short)
172 #               res="$res${scm:++}"
173                 res="${res}"
174         fi

大家好。我找到了一个简单的解决方案。 只需要修改环境变量即可。
export LOCALVERSION=

那就是全部。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接