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.
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. –
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. –
Sembra che gli EABI siano compatibili con le versioni precedenti, quindi mi sono diretto nella direzione sbagliata per un po '. –