我正在尝试为ARM架构制作可加载的内核模块。例如,我做了简单的hello.c
#include <linux/module.h> /* Needed by all modules */
#include <linux/kernel.h> /* Needed for KERN_INFO */
static int __init hello_start(void)
{
printk(KERN_INFO "Loading hello module...\n");
return 0;
}
static void __exit hello_end(void)
{
printk(KERN_INFO "Goodbye Mr.\n");
}
module_init(hello_start);
module_exit(hello_end);
并创建了Makefile
obj-m := hello.o
PWD := $(shell pwd)
ARCH=arm
CROSS_COMPILE_LINARO=/home/cooperok/mk908/gcc-linaro-arm-linux-gnueabihf-4.7-2013.01-20130125_linux/bin/arm-linux-gnueabihf-
KERNEL_ROCKCHIP=/home/cooperok/mk908/kernel/
default:
make ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE_LINARO) -C $(KERNEL_ROCKCHIP) M=$(PWD) modules
clean:
make CROSS_COMPILE=$(CROSS_COMPILE_LINARO) -C $(KERNEL_ROCKCHIP) M=$(PWD) clean
两台计算机上的交叉编译器和内核源代码相同。当我在第一台机器上运行make时,使用insmod命令成功安装了hello.ko文件,但是当我在第二台机器上编译模块并尝试安装该模块时,我收到错误“ insmod :插入'hello.ko'时出错:-1模块格式无效 “
据我所知,模块正在使用我在CROSS_COMPILE(arm-linux-gnueabihf-gcc等)中指定的交叉编译器进行编译,只有它才能使模块在计算机上没有安装任何特定的库,是吗?
第一台计算机有64位操作系统(Ubuntu 12.04)和第二台32位操作系统(Linux Mint 12),这是主要区别,所以make util是不同的。但它是否真的是模块只在64位操作系统上正确编译的主要原因?如果是这样的问题,或者它真的处理不同的库?