Hello world 内核模块的 android 和未知的搬迁:27 时 insmod



我正在尝试创建一个简单的内核模块。我正在尝试将消息打印到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

有人知道为什么吗?如何让它发挥作用?

我自己做了一次阅读后发现,当它被编译时,重新定位部分指向了错误的方向。

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对我的帮助。


我自己做了一次阅读后发现,当它被编译时,重新定位部分指向了错误的方向。

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对我的帮助。

原来我必须使用

make CFLAGS_MODULE=-fno-pic

谢谢,-fno图片也让我的dlkm工作了。关于"真正的"工作。。。

顺便说一句,你可以在shell中导出ARCH、SUBARCH、CROSS_COMPILE、KERNELDIR,这样Makefile就变得非常简单了。这也允许通过正确设置KERNELDIR(本机不需要ARCH、SUBARCH或CROSS_COMPILE变量)来更容易地为本机或目标平台构建dlkm

obj-m+=你好.o

全部:make-C$(KERNELDIR)M=$(PWD)模块

最新更新