Вопрос по module, kernel-module, android, kernel, linux-kernel – Модуль ядра Hello world для android и неизвестного перемещения: 27 при insmod

13

Я пытаюсь создать простой модуль ядра. Я пытаюсь напечатать сообщения в 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 за помощь в этом.

Кажется, EABI обратно совместимы, поэтому я некоторое время двигался в неправильном направлении. raising hope
Теперь я обнаружил, что в моем разделе «Перемещение модуля hello world» - .rel.text & apos; со смещением 0x6b8 содержит 4 записи: Тип информации о смещении Sym.Value Sym. Имя 00000008 0000211b R_ARM_PLT32 00000000 printk, тогда как в wifimodule 00001c4c 000d421c R_ARM_CALL 00000000 printk raising hope
Да, это неправильное перемещение. Если я изменяю hex через редактор hex с R_ARM_PLT32 (1B) на R_ARM_CALL (1C), он переходит и останавливается в другой ошибке перемещения. Может кто-нибудь угадать, что я могу сделать неправильно, чтобы получить неправильные перемещения? raising hope
Я думаю, что у нас есть преимущество. Различие, которое я обнаружил при выполнении readelf, было Flag было "0x5000000, Version5 EABI". для работающего модуля и флажок «0x4000000, EABI версии 4»; для моего модуля. Это влияет на что-нибудь? Я не могу найти место, чтобы изменить это. Я ищу это. Если кто-нибудь знает, пожалуйста, дайте мне знать. raising hope
Вероятно, проблема в системе сборки. Вы уверены, что можете использовать набор инструментов ndk для ядра? Я помню, что вы не могли в прошлом, но, возможно, это изменилось. Возможно, стоит сравнить objdump / readelf вашего модуля с любым рабочим, который вы можете найти, и посмотреть типы перемещений. Chris Stratton

Ваш Ответ

2   ответа
0

Спасибо, -fno-pic заставил работать мой dlkm. На «реальный» Работа...

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

obj-m + = hello.o

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

10

Оказывается, я должен был использовать

make CFLAGS_MODULE=-fno-pic

Похожие вопросы