Я пытаюсь загрузить модуль ядра для Android.
Во-первых, я скачал исходный код ядра с целевого устройства, которое MotoG5 отсюда: https://github.com/MotorolaMobilityLLC/kernel-msm. Кроме того, я имеюдобавил эти файлы, которые содержат f2fs для компиляции ядра (доступно здесь https://github.com/MotorolaMobilityLLC/motorola-kernel). Я смог скомпилировать ядро, используя следующие команды:
export CROSS_COMPILE=/media/hero/HDD1/android-ndk-r15c/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-
export ARCH=arm
make clean && make mrproper
make msm8937-perf_defconfig
make -j4
make modules // to generate Module.symvers which can be used later to compile a kernel module.
Затем я написал небольшой код ядра следующим образом:
#include "linux/module.h"
#include "linux/kernel.h"
//replace the "" with angular brackets
int init_module(void)
{
printk(KERN_INFO "Hello android kernel...\n");
return 0;
}
void cleanup_module(void)
{
printk(KERN_INFO "Goodbye android kernel...\n");
}
android_module.c
obj-m += android_module.o
KDIR := /media/hero/HDD1/k3/kmsm/
PWD := $(shell pwd)
ARCH=arm
CROSS_COMPILE=/media/hero/HDD1/android-ndk-r15c/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-
all:
make -C $(KDIR) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) M=$(PWD) modules
clean:
$(MAKE) -C $(KDIR) M=$(PWD) clean
Makefile
После этого я смог успешно скомпилировать ядро без предупреждения. Вот некоторая информацияо выводе команды vermagic и file для сгенерированного модуля ядра.
root@root:/hello3# modinfo android_module.ko
filename: /media/hero/HDD1/hello3/android_module.ko
depends:
vermagic: 3.18.31-perf SMP preempt mod_unload modversions ARMv7 p2v8
root@root:/hello3# file android_module.ko
android_module.ko: ELF 32-bit LSB relocatable, ARM, EABI5 version 1 (SYSV), BuildID[sha1]=a9bcb514badd8f5799151e0ee4993fd73302175c, with debug_info, not stripped
Я сравниваю эту информацию с существующим модулем ядра в телефоне, и они точно совпадают. Это пример существующего загружаемого ядра.
modinfo *******.ko
filename: *******.ko
license: GPL
description: Input driver event debug module
author: Vojtech Pavlik <vojtech@ucw.cz>
alias: input:b*v*p*e*-e*k*r*a*m*l*s*f*w*
depends:
intree: Y
vermagic: 3.18.31-perf SMP preempt mod_unload modversions ARMv7 p2v8
file *******.ko
evbug.ko: ELF 32-bit LSB relocatable, ARM, EABI5 version 1 (SYSV), BuildID[sha1]=b14c49bf595842f41a31b9a5d0e66bc8523703a8, with debug_info, not stripped
Сейчас. Проблема в том, что когда я загружаю модуль, я получаю это сообщение
insmod: failed to load android_module.ko: Exec format error
Кроме того, dmesg показывает следующее:
android_module: no symbol version for module_layout
Обратите внимание, что некоторыеответы наЛиния сказала, что я должен сгенерировать Module.symvers перед компиляцией модуля ядра, поэтому я сделал это, и я не столкнулся с какой-либо ошибкой, касающейся отсутствия Module.symvers при компиляции модуля ядра.
Есть идеи, почему этот модуль нельзя загрузить?пожалуйста, дайте мне знать.
С уважением,