内核模块符号导出
内核符号表引入
驱动程序可以编译成内核模块,也就是KO文件。每个KO文件是相互独立的,也就是说模块之间无法互相访问。但是在某些使用场、要互相访问,如B模块要用A模块中的函数。(B模块依赖于A模块)这时候我们要怎么做呢?
什么是符号表?
所谓“符号"就是内核中的函数名,全局变量名等。符号表就是用来记录这些“符号"的文件。
内核符号表导出
模块可以使用一下宏EXPORT_SYMBOL和EXPORT_SYMBOL_GPL导出符号到内核符号表中。
如:
EXPORT_SYMBOL(符号名);
EXPORT_SYMBOL_GPL(符号名);//只适用于包含GPL许可的模块。
导出去的符号可以被其他模块使用。使用前只需要声明一下即可。
实现
a.c
#include <linux/module.h>
#include <linux/init.h>
extern int add_test(int a,int b);
int add_test(int a,int b){
return (a+b);
}
EXPORT_SYMBOL(add_test);
static int hello_init(void){
printk("hello init!!!\n");
return 0;
}
static void hello_exit(void){
printk("hello exit!!!\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_AUTHOR("Paranoid");
MODULE_VERSION("V1.0");
MODULE_LICENSE("GPL");
查看符号表
编译被依赖的模块后,将生成的符号表文件复制到依赖模块所在文件夹,再编译另一个模块
b.c
#include <linux/module.h>
#include <linux/init.h>
extern int add_test(int a,int b);
static int hello_init(void){
int a;
a = add_test(1,2);
printk("add:%d\n",a);
printk("hello init!!!\n");
return 0;
}
static void hello_exit(void){
printk("hello exit!!!\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_AUTHOR("Paranoid");
MODULE_VERSION("V1.0");
MODULE_LICENSE("GPL");
结果