linux2.6的 /proc/kallsyms 文件对应着内核符号表,它记录了符号及符号的内存地址。
模块可以使用如下宏 导出符号到内核符号表:
EXPORT_SYMBOL(name);
EXPORT_SYMBOL_GPL(name); //只适用于包含GPL许可权的模块。
示例:export_symb.c
导出整数加,减运算函数符号的内核模块。
xxha@xxha-OptiPlex-780:~/share/learning/songbaohua/4_char_device_driver/export_symbol$vim export_symb.c
1 /*======================================================================
2 A simple kernel module to introduce export symbol
3
4 The initial developer of the original code is Baohua Song
5 <author@linuxdriver.cn>. All Rights Reserved.
6 ======================================================================*/
7 #include <linux/init.h>
8 #include <linux/module.h>
9 MODULE_LICENSE("Dual BSD/GPL");
10
11 int add_integar(int a,int b)
12 {
13 return a+b;
14 }
15
16 int sub_integar(int a,int b)
17 {
18 return a-b;
19 }
20
21 EXPORT_SYMBOL(add_integar);
22 EXPORT_SYMBOL(sub_integar);
xxha@xxha-OptiPlex-780:~/share/learning/songbaohua/4_char_device_driver/export_symbol$vim Makefile
1 obj-m := export_symb.o
2
3 clean:
4 rm -rf *.ko *.mod.c *.o *.order *.symvers
xxha@xxha-OptiPlex-780:~/share/learning/songbaohua/4_char_device_driver/export_symbol$ make -C /usr/src/linux-headers-2.6.35-22-generic/ M=$(pwd) modules
make:进入目录'/usr/src/linux-headers-2.6.35-22-generic'
CC [M] /home/xxha/share/learning/songbaohua/4_char_device_driver/export_symbol/export_symb.o
Building modules, stage 2.
MODPOST 1 modules
CC /home/xxha/share/learning/songbaohua/4_char_device_driver/export_symbol/export_symb.mod.o
LD [M] /home/xxha/share/learning/songbaohua/4_char_device_driver/export_symbol/export_symb.ko
make:离开目录“/usr/src/linux-headers-2.6.35-22-generic”
可以使用make clean删除多余的编译结果。
xxha@xxha-OptiPlex-780:~/share/learning/songbaohua/4_char_device_driver/export_symbol$make clean
rm -rf *.ko *.mod.c *.o *.order *.symvers
xxha@xxha-OptiPlex-780:~/share/learning/songbaohua/4_char_device_driver/export_symbol$sudo insmod export_symb.ko
xxha@xxha-OptiPlex-780:~/share/learning/songbaohua/4_char_device_driver/export_symbol$cat /proc/kallsyms | grep integar
ffffffffa004a050 r __ksymtab_sub_integar [export_symb]
ffffffffa004a080 r __kstrtab_sub_integar [export_symb]
ffffffffa004a070 r __kcrctab_sub_integar [export_symb]
ffffffffa004a060 r __ksymtab_add_integar [export_symb]
ffffffffa004a08c r __kstrtab_add_integar [export_symb]
ffffffffa004a078 r __kcrctab_add_integar [export_symb]
ffffffffa004a000 T add_integar [export_symb]
ffffffffa004a010 T sub_integar [export_symb]
上面就是导出到内核的符号表,但是怎么使用他们呢,还不知道。
应该是别的程序中,可以调用 add_integar 和 sub_integar 吧。
这就是导出符号的示例export_symb.ko, 很简单。