android - 加载 android 内核模块时出错(module_layout 没有符号版本)
问题描述
我正在尝试为 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
生成文件
在那之后,我能够成功编译内核而没有任何警告。以下是有关生成的内核模块的 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 的错误。
任何想法,为什么这个模块不能被加载?请告诉我。
问候,
解决方案
推荐阅读
- git - smartgit上分支窗口中的箭头
- sql - 编写查询以从表 A 派生表 B
- firebase - Flutter firebase_messaging iOS应用程序在前台应用程序时未收到推送通知
- node.js - 为什么console.log在nodejs的app.js中出现两次
- mysql - mysql - 计算两个日期之间的差异
- c# - LINQ order by another property is first property is equal to a given value
- search - 将列表转换为节点指针
- kubernetes - 使用 Katacoda 跟踪 Kubernetes
- c# - Angular7 - .NET Core v2 抛出 http 415(不支持的媒体类型)
- 64-bit - 我无法在window 7 64位平台上写入并口的控制寄存器,为什么?