许可证符号未在Android内核模块对象中导出

时间:2014-12-03 08:36:00

标签: android linux-kernel kernel-module

构建这个简单的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. 

1 个答案:

答案 0 :(得分:0)

在Makefile中将CFLAGS_MODULE=-fno-pic更改为EXTRA_CFLAGS=-fno-pic解决了这个问题。