2012-07-23 19 views
13

Estoy tratando de crear un módulo kernel simple. Estoy intentando imprimir mensajes a dmesg pero me siguen dandoHola módulo kernel mundial para Android y reubicación desconocida: 27 cuando insmod

insmod: init_module 'hello.ko' falló (error de formato Exec) en Android

después: dmesg: reubicación desconocida: 27

#include <linux/module.h> 
#include <linux/kdb.h> 
int init_module(void) 
{ 
    printk(KERN_ALERT "Hello world!\n"); 
    return 1; 
} 

void cleanup_module(void) 
{ 
    printk(KERN_INFO "Goodbye world 1.\n"); 
} 
MODULE_AUTHOR("Robert P. J. Day"); 
MODULE_LICENSE("Dual BSD/GPL"); 
MODULE_VERSION("2:1.0") ; 
MODULE_DESCRIPTION("You have to start somewhere."); 

El archivo make

obj-m +=hello.o 


KERNELDIR ?= ~/android/kernel/common 
#KERNELDIR ?= /lib/modules/$(shell uname -r)/build 
PWD := $(shell pwd) 
CROSS_COMPILE=~/android-ndk-r8/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi- 

ARCH=arm 
default: 
$(MAKE) -C $(KERNELDIR) M=$(PWD) ARCH=arm CROSS_COMPILE=$(CROSS_COMPILE) modules 

clean: 
$(MAKE) -C $(KERNELDIR) M=$(PWD) clean 
rm *.symvers 

¿alguien sabe por qué? ¿Y cómo hacerlo funcionar?

Después de hacer un readelf encontré que cuando se compila la sección de reubicación apunta a las direcciones incorrectas.

Offset  Info Type   Sym.Value Sym. Name 
00000008 0000171b R_ARM_PLT32  00000000 printk 

cuando en realidad debería ser:

Offset  Info Type   Sym.Value Sym. Name 
00000008 0000171c R_ARM_CALL  00000000 printk 

Puede alguien adivinar/saben cómo esto podría ser? Gracias @Chris Stratton por ayudarme hasta aquí.


Después de hacer un readelf encontré que cuando se compila la sección de reubicación está apuntando en las direcciones incorrectas.

Offset  Info Type   Sym.Value Sym. Name 
00000008 0000171b R_ARM_PLT32  00000000 printk 

cuando en realidad debería ser:

Offset  Info Type   Sym.Value Sym. Name 
00000008 0000171c R_ARM_CALL  00000000 printk 

Puede alguien adivinar/saben cómo esto podría ser? Gracias @Chris Stratton por ayudarme hasta ahora.

+1

Probablemente un problema del sistema de compilación. ¿Estás seguro de que puedes usar la cadena de herramientas ndk para un kernel? Mi recuerdo es que no se podía en el pasado, pero tal vez eso ha cambiado. Podría valer la pena objdump/readelf su módulo frente a cualquier trabajo que pueda encontrar y ver los tipos de reubicaciones. –

+0

Creo que tenemos una ventaja. La diferencia que encontré cuando realicé readelf fue Flag era "0x5000000, Version5 EABI" para un módulo en ejecución y Flag es "0x4000000, Version4 EABI" para mi módulo. ¿Esto afecta algo? No puedo encontrar ningún lugar para cambiarlo. Lo estoy buscando. Si alguien sabe, por favor hágamelo saber. –

+0

Parece que las EABI son compatibles con versiones anteriores, por lo que me dirigí en la dirección incorrecta por un tiempo. –

Respuesta

10

Resulta que tuve que usar

make CFLAGS_MODULE=-fno-pic 
0

Gracias, -fno-pic tiene mi DLKM de trabajo también. En el trabajo "real" ...

BTW, puede exportar ARCH, SUBARCHAR, CROSS_COMPILE, KERNELDIR en el shell para que el Makefile sea muy simple. Esto también permite a uno construir más fácilmente el DLKM para la plataforma nativa o de destino mediante el establecimiento de la KERNELDIR adecuadamente (nativo no necesita de la ARCH, subarq o CROSS_COMPILE vars.)

obj-m + = hola.o

all: make -C $ (KERNELDIR) M = $ (PWD) módulos

Cuestiones relacionadas