在構建這個簡單的例子,Android的內核模塊許可標誌不出口了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-g1e8b3d8
在https://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.
'nm'列出了您應該使用'strings example_module.ko | grep GPL'。這應該輸出類似'license = GPL'的東西。對於nm「r」該符號位於只讀數據部分,但該值是存儲在文本部分中的常量字符串。 – askb 2014-12-04 04:59:11
我同意你在'example_module.ko'中尋找具體許可證的方式是正確的。然而,我的問題是,許可證符號不會被導出,因此模塊變得污染,kprobe處理程序無法使用(僅適用於內核'2.6.35.7-gf5f63ef')。 – jckuester 2015-03-11 05:29:49