可装入的内核模块无法在不同的计算机上正确编译

时间:2014-07-18 13:42:35

标签: c linux-kernel arm kernel-module

我正在尝试为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位操作系统上正确编译的主要原因?如果是这样的问题,或者它真的处理不同的库?

0 个答案:

没有答案