符号导出的概念
就是可以做一些通用的模块,里面存着一些通用的函数可以给其他模块调用,具体理解看效果。
一共需要三个文件:
3th_export_function.c --要生成导出函数的模块的源文件
3th_call_lchadd.c --普通的驱动模块源文件
3th_call_lchadd.h --声明导出函数,以便驱动模块源文件调用而不报错
代码:3th_export_function.c
要点:和驱动模块类似,但是不用写入口出口函数。
写了一个加的函数。
#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("LCH");
int lch_add(int a,int b){
return (a+b);
}
EXPORT_SYMBOL(lch_add);
代码:3th_call_lchadd.h
int lch_add(int a,int b);
代码:3th_call_lchadd.c
#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("LCH");
#include "3th_call_lchadd.h"
static int __init hello_init(void)
{
printk(KERN_EMERG "call-lch_add\n");
printk(KERN_EMERG "lch_add 33+33 = %d\n",lch_add(33,33));
return 0;
}
static void __exit hello_exit(void)
{
}
//
module_init(hello_init);
module_exit(hello_exit);
将以下两个文件都编译成xx.ko
3th_export_function.c --要生成导出函数的模块的源文件
3th_call_lchadd.c --普通的驱动模块源文件
makefile如下:
#!/bin/bash
#通知编译器我们要编译模块的哪些源码
#这里是编译itop4412_hello.c这个文件编译成中间文件itop4412_hello.o
obj-m += 3th_call_lchadd.o 3th_export_function.o
#源码目录变量,这里用户需要根据实际情况选择路径
#作者是将Linux的源码拷贝到目录/home/topeet/android4.0下并解压的
KDIR := /home/topeet/work100G/newkernel/4412_SCP_5.3.18/kernel
#当前目录变量
PWD ?= $(shell pwd)
#make命名默认寻找第一个目标
#make -C就是指调用执行的路径
#$(KDIR)Linux源码目录,作者这里指的是/home/topeet/android4.0/iTop4412_Kernel_3.0
#$(PWD)当前目录变量
#modules要执行的操作
all:
make -C $(KDIR) M=$(PWD) modules
rm -rf *.o *order *symvers *mod* makefile~
cp *.ko /home/topeet/nfs/rootfs/workspace-lch/
echo 'copy done'
#make clean执行的操作是删除后缀为o的文件
clean:
rm -rf *.o *order *symvers *mod* makefile~
运行效果:
先加载导出函数的驱动模块,再加载使用到导出函数的驱动模块,这样才能使用对应的函数。