13

我正在尝试创建一个简单的内核模块。我正在尝试将消息打印到 dmesg 但我不断收到

insmod:android 中的 init_module 'hello.ko' 失败(执行格式错误)

之后: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 到目前为止帮助我。

4

2 回答 2

10

事实证明我不得不使用

make CFLAGS_MODULE=-fno-pic
于 2012-07-25T15:12:12.620 回答
0

谢谢,-fno-pic 也让我的 dlkm 工作了。开始“真正的”工作......

顺便说一句,您可以在 shell 中导出 ARCH、SUBARCH、CROSS_COMPILE、KERNELDIR,因此 Makefile 变得非常简单。这还允许通过正确设置 KERNELDIR 更轻松地为本机或目标平台构建 dlkm(本机不需要 ARCH、SUBARCH 或 CROSS_COMPILE 变量。)

obj-m += hello.o

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

于 2013-01-25T02:51:59.870 回答