我正在尝试交叉编译一个具有规范的 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
遗憾的是,它说的很少。
最佳答案
感谢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
关于linux-kernel - 交叉编译内核模块: invalid module format,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9341701/