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.
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. –
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. –
Es scheint, dass EABIs abwärtskompatibel sind, also ging ich für eine Weile in die falsche Richtung. –