2012-07-23 1 views
13

Sto provando a creare un modulo del kernel semplice. Sto cercando di stampare i messaggi di dmesg, ma continuo a ricevereCiao modulo del kernel del mondo per Android e trasferimento sconosciuto: 27 quando insmod

insmod: init_module 'hello.ko' non riuscita (errore di formato Exec) in Android

dopo: dmesg: sconosciuta trasferimento: 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."); 

Il file 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 

qualcuno sa perché? E come farlo funzionare?

Ho trovato dopo aver letto che quando è compilato la sezione di trasferimento punta verso le direzioni sbagliate.

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

quando in realtà dovrebbe essere:

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

Qualcuno può immaginare/so come questo potrebbe essere? Grazie a @Chris Stratton per avermi aiutato fino a questo punto.


Ho trovato dopo aver letto che quando è compilato la sezione di trasferimento punta verso le direzioni sbagliate.

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

quando in realtà dovrebbe essere:

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

Qualcuno può immaginare/so come questo potrebbe essere? Grazie a @Chris Stratton per avermi aiutato fino a questo punto.

+1

Probabilmente un problema di sistema di generazione. Sei sicuro di poter usare la toolchain ndk per un kernel? Il mio ricordo è che non si poteva in passato, ma forse è cambiato. Potrebbe valere la pena di confrontare il tuo modulo con quello di lavoro che puoi trovare e osservare i tipi di riposizionamenti. –

+0

Penso che abbiamo un vantaggio. La differenza che ho riscontrato durante l'esecuzione era Flag era "0x5000000, Version5 EABI" per un modulo in esecuzione e Flag è "0x4000000, Version4 EABI" per il mio modulo. Questo influisce su qualcosa? Non riesco a trovare alcun posto per cambiarlo. Lo sto cercando. Se qualcuno sa, per favore fatemi sapere. –

+0

Sembra che gli EABI siano compatibili con le versioni precedenti, quindi mi sono diretto nella direzione sbagliata per un po '. –

risposta

10

Si scopre che ho dovuto usare

make CFLAGS_MODULE=-fno-pic 
0

Grazie, -fno-pic ottenuto la mia DLKM lavorare anche. Per lavori "reali" ...

BTW, puoi esportare ARCH, SUBARCH, CROSS_COMPILE, KERNELDIR nella shell in modo che il Makefile diventi molto semplice. Questo permette anche di costruire più facilmente la DLKM per la piattaforma nativa o di destinazione impostando il KERNELDIR correttamente (nativo non ha bisogno l'arco, SUBARCH o CROSS_COMPILE Vars.)

obj-m + = hello.o

tutti: make -C $ (KERNELDIR) M = $ (PWD) moduli