我正在尝试创建一个简单的内核模块。 我正在尝试将消息打印到dmesg,但我一直在
insmod:init_module'hello.ko'在android中失败(Exec格式错误)
之后: dmesg的: 未知的搬迁: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.");
制作文件
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帮我这么做。
答案 0 :(得分:10)
事实证明我必须使用
make CFLAGS_MODULE=-fno-pic
答案 1 :(得分:0)
谢谢,-fno-pic让我的dlkm工作了。关于“真正的”工作......
顺便说一句,你可以在shell中导出ARCH,SUBARCH,CROSS_COMPILE,KERNELDIR,这样Makefile就变得非常简单了。这也允许通过正确设置KERNELDIR(本机不需要ARCH,SUBARCH或CROSS_COMPILE变量)来更轻松地为本机或目标平台构建dlkm。
obj-m + = hello.o
所有: make -C $(KERNELDIR)M = $(PWD)模块