2012-07-23 13 views
13

Ich versuche, ein einfaches Kernel-Modul zu erstellen. Ich versuche, Nachrichten zu drucken, um dmesg, aber ich bekomme immer wiederHallo Welt Kernel-Modul für Android & unbekannt Umzug: 27 Wenn Insmod

insmod: init_module 'hello.ko' ist fehlgeschlagen (Exec Formatfehler) in android

nach: dmesg: unbekannt Umzug: 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."); 

Die makefile

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 

Wer weiß, warum? Und wie funktioniert es?

Ich fand nach einer Readelf, dass, wenn es kompiliert wird, der Verlagerung Abschnitt in die falsche Richtung zeigt.

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

Wenn in der Tat sollte es sein:

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

Kann jemand erraten/wissen, wie das sein könnte? Danke @Chris Stratton für die Hilfe bis jetzt.

Ich habe nach einem readelf gefunden, dass, wenn es kompiliert wird, der Umzug-Abschnitt in die falschen Richtungen zeigt.

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

Wenn in der Tat sollte es sein:

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

Kann jemand erraten/wissen, wie das sein könnte? Danke @Chris Stratton für die Hilfe bis jetzt.

+1

Wahrscheinlich ein Build-System-Problem. Sind Sie sicher, dass Sie die ndk toolchain für einen Kernel verwenden können? Ich erinnere mich, dass Sie das in der Vergangenheit nicht konnten, aber vielleicht hat sich das geändert. Es könnte sich lohnen, Ihr Modul im Vergleich zu einem anderen Arbeitsmodell, das Sie finden können, zu überprüfen und zu prüfen, welche Art von Standortverlagerungen sich ergeben. –

+0

Ich glaube, wir haben einen Vorsprung. Der Unterschied, den ich gefunden habe, wenn ich readelf war Flag war "0x5000000, Version5 EABI" für ein laufendes Modul und Flag ist "0x4000000, Version4 EABI" für mein Modul. Beeinflusst das irgendetwas? Ich kann keinen Platz finden, um es zu ändern. Ich suche danach. Wenn jemand weiß, lass es mich wissen. –

+0

Es scheint, dass EABIs abwärtskompatibel sind, also ging ich für eine Weile in die falsche Richtung. –

Antwort

10

Es stellt sich heraus, dass ich

make CFLAGS_MODULE=-fno-pic 
0

Danke, -fno-pic habe meine DLKM arbeiten auch verwenden musste. Auf "echte" Arbeit ...

BTW, können Sie ARCH, SUBARCH, CROSS_COMPILE, KERNELDIR in der Shell exportieren, so dass das Makefile sehr einfach wird. Dies ermöglicht auch eine leicht die DLKM für die native oder Zielplattform aufzubauen, indem die KERNELDIR Einstellung richtig (native braucht nicht die ARCH, subarch oder CROSS_COMPILE Vars.)

obj-m + = hello.o

alle: make -C $ (KERNELDIR) M = $ (PWD) Module