Linux设备驱动开发之内核模块中导出符号表

导出符号表可以让一个内核模块,调用另外一个
	内核模块中的函数,它可以让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



 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值