Linux的“/proc/kallsyms”文件对应着内核符号表,它记录了符号以及符号所在的内存地址。
模块可以使用如下宏导出符号到内核符号表中:
EXPORT_SYMBOL(符号名); EXPORT_SYMBOL_GPL(符号名);
导出的符号可以被其他模块使用,只需使用前声明一下即可。EXPORT_SYMBOL_GPL()只适用于包含GPL许可权的模块。代码清单4.5给出了一个导出整数加、减运算函数符号的内核模块的例子。
代码清单4.5 内核模块中的符号导出
1#include <linux/init.h> 2#include <linux/module.h> 3 4int add_integar(int a, int b) 5{ 6 return a + b; 7} 8EXPORT_SYMBOL_GPL(add_integar); 9 10int sub_integar(int a, int b) 11{ 12 return a - b; 13} 14EXPORT_SYMBOL_GPL(sub_integar); 15 16MODULE_LICENSE("GPL v2");
从“/proc/kallsyms”文件中找出add_integar、sub_integar的相关信息:
# grep integar /proc/kallsyms e679402c r __ksymtab_sub_integar [export_symb] e679403c r __kstrtab_sub_integar [export_symb] e6794038 r __kcrctab_sub_integar [export_symb] e6794024 r __ksymtab_add_integar [export_symb] e6794048 r __kstrtab_add_integar [export_symb] e6794034 r __kcrctab_add_integar [export_symb] e6793000 t add_integar [export_symb] e6793010 t sub_integar [export_symb]