linux模块导出符号 EXPORT_SYMBOL_GPL EXPORT_SYMBOL用法
通过 EXPORT_SYMBOL 导出的符号可以被包含GPL许可权的模块和不包含GPL许可权的模块调用;通过 EXPORT_SYMBOL_GPL 导出的符号只能被包含GPL许可权的模块调用具体使用如下面两个例子// A module#include <linux/init.h>#include <linux/module.h>int add_integar(int a, i
·
通过 EXPORT_SYMBOL 导出的符号可以被包含GPL许可权的模块和不包含GPL许可权的模块调用;
通过 EXPORT_SYMBOL_GPL 导出的符号只能被包含GPL许可权的模块调用
具体使用如下面两个例子
在这里插入代码片
```// A module
#include <linux/init.h>
#include <linux/module.h>
int add_integar(int a, int b)
{
return a + b;
}
EXPORT_SYMBOL(add_integar);
int sub_integar(int a, int b)
{
return a - b;
}
EXPORT_SYMBOL_GPL(sub_integar);
static int __init A_init(void)
{
printk(KERN_INFO "A enter\n");
return 0;
}
static void __exit A_exit(void)
{
printk(KERN_INFO "A exit\n");
}
module_init(A_init);
module_exit(A_exit);
MODULE_AUTHOR("TASK_RUNNING.\n");
MODULE_LICENSE("GPL v2");
MODULE_DESCRIPTION("export symbol module.\n");
```c
在这里插入代码片
// B module
#include <linux/init.h>
#include <linux/module.h>
//此处需要用extern声明外部符号
extern int add_integar(int a, int b);
extern int sub_integar(int a, int b);
static int __init B_init(void)
{
printk(KERN_INFO "B module enter\n");
printk(KERN_INFO "ADD = %d\n", add_integar(5, 6));
printk(KERN_INFO "SUB = %d\n", sub_integar(6, 5));
return 0;
}
static void __exit B_exit(void)
{
printk(KERN_INFO "B module exit\n");
}
module_init(B_init);
module_exit(B_exit);
MODULE_AUTHOR("TASK_RUNNING.\n");
MODULE_LICENSE("GPL v2");
MODULE_DESCRIPTION("use symbol module.\n");
注意顺序,首先是先将模块A编译,因为模块A编译后目录下的Module.symvers文件中才有导出的符号,然后再将该文件拷贝到 模块B目录下,有这个文件后编译的模块B才不会报错。
接着就是加载模块,这里也一定要有顺序,应当先加载A模块再加载B模块,写在也是先写在B模块再写在A模块,顺序反了会报错的
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐



所有评论(0)