导出符号表可以让一个内核模块,调用另外一个
内核模块中的函数,它可以让linux更简约,防止
代码冗余的现象。还可以让驱动工程师写否写复杂
驱动的时候更简答。
EXPORT_SYMBOL_GPL(sym)
功能:将函数或者变量的符号表导出
参数:
@sym:函数名或者变量名
编译:
1.先编译提供者模块,编译完之后会产生一个
Module.symvers,这个文件中记录的就是函
数的名字及地址
2.在编译调用者前需要将Module.symvers拷贝到
调用者目录下,然后执行make,如果不拷贝会提示
add undefined
安装:
先安装提供者,在安装调用者
卸载:
先卸载调用者,在卸载提供者
a模块
demoA.c
#include <linux/init.h>
#include <linux/module.h>
int add(int a,int b)
{
return (a+b);
}
EXPORT_SYMBOL_GPL(add);
//入口
static int __init demo_init(void)
{
printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);
return 0;
}
//出口
static void __exit demo_exit(void)
{
printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);
}
module_init(demo_init);
module_exit(demo_exit);
MODULE_LICENSE("GPL");
Makefile
KERNELDIR:= /lib/modules/$(shell uname -r)/build/
#KERNELDIR:= /home/linux/kernel/kernel-3.4.39/
PWD:=$(shell pwd)
all:
make -C $(KERNELDIR) M=$(PWD) modules
clean:
make -C $(KERNELDIR) M=$(PWD) clean
obj-m:=demoA.o
b模块
demoB.c
#include <linux/init.h>
#include <linux/module.h>
extern int add(int a,int b);
//入口
static int __init demo_init(void)
{
printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);
printk("sum = %d\n",add(100,200));
return 0;
}
//出口
static void __exit demo_exit(void)
{
printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);
}
module_init(demo_init);
module_exit(demo_exit);
MODULE_LICENSE("GPL");
Makefile
KERNELDIR:= /lib/modules/$(shell uname -r)/build/
#KERNELDIR:= /home/linux/kernel/kernel-3.4.39/
PWD:=$(shell pwd)
all:
make -C $(KERNELDIR) M=$(PWD) modules
clean:
make -C $(KERNELDIR) M=$(PWD) clean
obj-m:=demoB.o