构建这个简单的Android内核模块示例
#include <linux/kernel.h>
#include <linux/module.h>
int init_module(void)
{
return 0;
}
void cleanup_module(void)
{
printk("exit module.");
}
MODULE_LICENSE("GPL");
MODULE_AUTHOR("jckuester");
对于内核2.6.35.7-gf5f63ef
(用于相当旧的Android版本2.3.6),许可证和作者符号不会导出。 Makefile看起来像这样:
ANDROID_EABI := $(ANDROID_NDK)/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86_64/bin
obj-m += example_module.o
example-objs := example-base.o
default:
$(MAKE) ARCH=arm CFLAGS_MODULE=-fno-pic CROSS_COMPILE=$(ANDROID_EABI)/arm-linux-androideabi- -C $(KDIR_SAMSUNG) M=$(PWD) modules
通过签出提交https://android.googlesource.com/kernel/samsung.git
,git repo f5f63ef
中提供了内核源代码。
如果我在3.1.10-g1e8b3d8
中为Android内核https://android.googlesource.com/kernel/tegra.git
(用于Nexus 7上的Android 4.3)构建相同的模块,则会导出许可证和作者符号:
nm example_module.ko
00000029 r __mod_license360
00000000 r __mod_license753
0000000c r __mod_author361
有谁知道为什么不导出许可证和作者符号?我认为这是一个内核问题,与Android无关。 AFIK,MODULE_LICENSE被添加到2.4.10内核中,因此它应该可以工作。
我需要它,因为否则内核会被污染,然后我无法在我的内核模块中使用kprobes
:
<4>[ 454.092541] example: bad vermagic: kernel tainted.
<4>[ 454.092709] Disabling lock debugging due to kernel taint
<4>[ 454.092895] example: module license 'unspecified' taints kernel.
答案 0 :(得分:0)
在Makefile中将CFLAGS_MODULE=-fno-pic
更改为EXTRA_CFLAGS=-fno-pic
解决了这个问题。