1.什么是符号?
主要是指全局变量和函数
2.为什么要符号导出?
linux内核采用的是模块化的形式管理内核代码。内核中每个模块之间是相互独立的,也就是说A模块的全局变量和函数,B模块是无法访问的。若B模块想要使用A模块中的已有符号,那么必须将A模块中的符号做符号导出,导出到模块符号表中,然后B模块可以使用A模块导出的符号。
3.如何导出符号?
linux内核给我们提供了两个函数宏,用他们做符号导出。
EXPORT_SYMBOL(符号名);
EXPORT_SYMBOL_GPL(符号名);
EXPORT_SYMBOL_GPL(gtest);
EXPORT_SYMBOL_GPL(func);
例如:
模块A-->符号导出的模块
hello.c-->EXPORT_SYMBOL_GPL(gtest);
EXPORT_SYMBOL_GPL(func);
make成功后会生成一个存放符号的本地符号表,本地符号表中存放的就是代码里导出的符号
4.符号表的类型
linux内核提供了两类符号表:
第一种:用户自定义模块导出的符号表,称为本地符号表Module.symvers
第二种:内核全局符号表 /proc/kallsyms