我正在尝试为 Beaglebone(Linux、ARM)交叉编译一个外部模块。为了避免内核版本问题,我抓取了一个内核 tarball,并使用主机(x86)上的 CodeSourcery 工具链为 ARM 交叉编译。然后,我使用完全相同的工具链针对完全相同的内核源代码交叉编译了一个外部 hello-world 模块。我使用了这个简单的makefile:
obj-m += hello-1.o
all:
make -C /home/***/****/linux-3.2.0-beaglebone-20120411.00
M=$(PWD) modules
clean:
make -C /home/***/****/linux-3.2.0-beaglebone-20120411.00 M=$(PWD) clean
当我将 ko 文件复制到目标并尝试对其进行 insmod 时,我得到:“insmod: error inserting 'hello-1.ko': -1 Invalid module format”(从我在本组和其他地方学到的)通常源于冲突的内核版本,实际上 uname -a on the target 给出了:
Linux beaglebone 3.2.18 #1 Wed May 30 14:21:54 CEST 2012 armv7l GNU/Linux
而 modinfo hello-1.ko 给出:
srcversion:140276773A3090F6F33891F 取决于:
vermagic:3.2.0+ mod_unload modversions ARMv5 p2v8
所以版本 3.2.18 与 3.2.0+(为什么是 +?)和 armv7l 与 ARMv5!
有谁知道为什么我得到不同的版本,尽管我是针对相同的内核源编译的(也许是一些配置)?
任何建议表示赞赏!
最好的,克里斯