Подтвердить что ты не робот

Привет, мировой модуль ядра для android и неизвестного переселения: 27, когда insmod

Я пытаюсь создать простой модуль ядра. Я пытаюсь печатать сообщения в dmesg, но я продолжаю получать

insmod: init_module 'hello.ko' не удалось (ошибка формата Exec) в android

после: 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.");

Файл make

    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 за то, что помогли мне до сих пор.

4b9b3361

Ответ 1

Оказывается, мне пришлось использовать

make CFLAGS_MODULE=-fno-pic

Ответ 2

Спасибо, -fno-pic тоже получил мой dlkm. На "настоящую" работу...

Кстати, вы можете экспортировать ARCH, SUBARCH, CROSS_COMPILE, KERNELDIR в оболочку, поэтому Makefile становится очень простым. Это также позволяет более легко построить dlkm для родной или целевой платформы, установив KERNELDIR правильно (native не нужен ARCH, SUBARCH или CROSS_COMPILE vars.)

obj-m + = hello.o

все:   make -C $(KERNELDIR) M = $(PWD) модули