linux-kernel - 交叉编译内核模块: invalid module format

标签 linux-kernel arm cross-compiling kernel-module

我正在尝试交叉编译一个具有规范的 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/

相关文章:

c - 如何在设备上运行 ARM 应用程序?

go - 将 Windows 64 (TDM-GCC-64) 上的 Go 交叉编译为 .linux 文件,但尽管 GOOS=linux 仍继续编译为 .exe 文件

linux - 在 32 位机器上创建 64 位 Debian 软件包

linux - 使用 pfsend 丢包的原因是什么

c - linux内核,如何遍历所有cpus?

c - 嵌入式设备的服务器架构

docker - "FTDI USB Serial Device converter now disconnected"docker 和 arm 的问题

java - 跨多个操作系统删除一个文件

c - 如何在Linux内核中打开并读取 `struct inode *`处的文件

linux - 完全公平调度程序 (CFS) : vruntime of long running processes