我正在尝试创建一个简单的内核模块。 我尝试向dmesg打印消息,但是一直收到以下错误:
insmod: init_module 'hello.ko' 失败(在安卓中出现“执行格式错误”)
之后: dmesg: unknown relocation: 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.");
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
有人知道为什么吗?以及如何让它工作?
我发现通过执行 readelf 命令,编译后的重定位部分指向了错误的方向。
Offset Info Type Sym.Value Sym. Name
00000008 0000171b R_ARM_PLT32 00000000 printk
实际上应该是这样的:
Offset Info Type Sym.Value Sym. Name
00000008 0000171c R_ARM_CALL 00000000 printk
有人能猜测/知道可能是什么问题吗? 感谢@Chris Stratton到目前为止的帮助。
我发现在进行readelf之后,当它被编译时,重定位部分指向错误的方向。
Offset Info Type Sym.Value Sym. Name
00000008 0000171b R_ARM_PLT32 00000000 printk
实际上,应该是这样的:
Offset Info Type Sym.Value Sym. Name
00000008 0000171c R_ARM_CALL 00000000 printk
有人能猜测/知道这可能是什么吗?感谢@Chris Stratton迄今为止的帮助。