通过 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模块,顺序反了会报错的

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐