linux跨,Linux 跨模块函数调用

2015 August 20 linux,module

Linux 跨模块函数调用

Linux 跨模块函数调用

在编写模块的时候,我们经常会同时编写多个模块,模块中的函数,难免会有相互调用的需求,这个时候我们需要修改调用这个函数的Makefile文件,使其可以找到要调用的函数。

我们可以举例Module A 与 Module B,Module A中含有Module B要调用的函数,模块A中使用EXPORT_SYMBOL或EXPORT_SYMBOL_GPL将要提供给B模块的函数导出,具体Module A的代码形式如下:void A_function(void)

{

printk("A function");

return;

}

EXPORT_SYMBOL(A_function);

这个时候我们通过make 可以生成一系列的中间文件,这里面包括Module.symvers,如果我们打开看这个符号表,可以发现这个文件包含函数虚拟地址,函数名,模块路径,导出形式EXPORT_SYMBOL。

然后我们在Module B中使用这个A_function,需要首先声明extern void A_function(void);然后才可以使用。extern void A_function(void);

static int __init B_init(void)

{

printk("B_func module init!\n");

A_function();

return 0;

}

我们已经把函数主体编写完毕,但是当我们使用insmod插入这个模块时,我们会发现系统提示Unknwon symbol,所以这个时候我们要向Module A的Makefile中加入Module B的Module.symvers,这样kernel在插入Module A时才知道Module B的位置。obj-m:= module-B.o

CURRENT_PATH:=$(shell pwd)

LINUX_KERNEL:=$(shell uname -r)

LINUX_KERNEL_PATH:=/lib/modules/$(LINUX_KERNEL)/build

KBUILD_EXTRA_SYMBOLS +=/home/dslab/kmod/huawei_hook/Module.symvers

export KBUILD_EXTRA_SYMBOLS

all:

make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules

clean:

make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) clean

还有一种方式,就是在kernel源码 编译的时候加入到源码树中的Module.symers,然后编译内核,不过显然这种方式过于笨重,推荐使用修改Module A的Module.symvers这种方式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值