导出符号
程序员文章站
2022-06-05 17:28:49
...
导出符号
- 解决的是模块之间的相互函数调用问题,使用导出符号可以在其他模块中使用该模块的变量或函数,可以形成模块依赖
a.c
int add(int a, int b){return a+b;}
EXPORT_SYMBOL(add);或者
EXPORT_SYMBOL_GPL(add);
a.h
extern int add(int, int);
b.c
#include "a.h"
add(10,20)
- 编写程序
import.c:
#include <linux/init.h>
#include <linux/module.h>
#include "export.h"
static int __init import_init(void) {
int res = 0;
res = add(100,200);
printk("res=%d\n",res);
return 0;
}
static void __exit import_exit(void) {
int res = add(5,8);
printk("res=%d\n",res);
}
module_init(import_init);
modele_init(import_exit);
MODULE_LICENSE("GPL");
-------------------------------------
export.c:
#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("GPL");
int add(int a, int b) {
printk("enter %s %s %d\n", __FILE__, __func__, __LINE__);
return a+b;
}
EXPORT_SYMBOL(add); //导出符号
--------------------------------------
export.h
#ifndef __EXPORT_H__
#define __EXPORT_H__
extern int add(int, int);//用之前需要先声明一下
#endif
- 安装程序
- 先安装export后安装import
- 查看信息
- 卸载程序
- 先卸载import后卸载export
- EXPORT_SYMBOL(add)和EXPORT_SYMBOL_GPL(add)区别;
- linux2.6的“/prob/kallsyms”文件对应着内核符号表,记录了符号以及符号所在的内存地址,模块可以使用如下宏导出符号到内核符号表
- 导出的符号可以被其他模块使用,不过使用之前一定要声明一下。
- EXPORT_SYMBOL_GPL()只适用于包含GPL许可权的模块。
上一篇: 最简单的内核模块编程