Опитвам се да направя зареждаем модул на ядрото за 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 на първата машина, компилираният файл hello.ko е инсталиран успешно с команда insmod, но когато компилирам модул на втора машина и се опитвам да инсталирам този модул, получавам грешка "insmod : грешка при вмъкване на 'hello.ko': -1 Невалиден формат на модул"
Доколкото разбирам, модулът се компилира с кроскомпилатор, който съм посочил в CROSS_COMPILE (arm-linux-gnueabihf-gcc и други) и само той ще направи модул без конкретни библиотеки, инсталирани на компютри, нали?
Първият компютър има 64-битова ОС (Ubuntu 12.04), а вторият 32-битова ОС (Linux Mint 12), това е основната разлика, така че make util е различен. Но това наистина ли е основната причина модулът да се компилира правилно само на 64-битова ОС? Ако е така, проблемът е в make, или наистина се занимава с различни библиотеки?