2014-12-03 66 views
0

在構建這個簡單的例子,A​​ndroid的內核模塊許可標誌不出口了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 

內核源代碼可以在git倉庫https://android.googlesource.com/kernel/samsung.git通過檢查提交f5f63ef

如果我構建例如針對Android內核3.1.10-g1e8b3d8https://android.googlesource.com/kernel/tegra.git(供Android 4.3的Nexus 7)同一模塊,許可和作者符號遠銷:

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

'nm'列出了您應該使用'strings example_module.ko | grep GPL'。這應該輸出類似'license = GPL'的東西。對於nm「r」該符號位於只讀數據部分,但該值是存儲在文本部分中的常量字符串。 – askb 2014-12-04 04:59:11

+0

我同意你在'example_module.ko'中尋找具體許可證的方式是正確的。然而,我的問題是,許可證符號不會被導出,因此模塊變得污染,kprobe處理程序無法使用(僅適用於內核'2.6.35.7-gf5f63ef')。 – jckuester 2015-03-11 05:29:49

回答

0

更改CFLAGS_MODULE=-fno-picEXTRA_CFLAGS=-fno-pic在Makefile解決了這個問題。