驱动导出符号表
对于有依赖的模块加载卸载顺序
加载顺序:先加载依赖模块,在加载模块; 卸载顺序:先卸载模块,在卸载依赖模块
驱动中的符号表类似吗,应用程序中的头文件用于把源文件中的函数名声明方便外部模块使用
math.c驱动程序
#include <linux/module.h>
int myadd(int x, int y) { return (x + y); } EXPORT_SYMBOL(myadd); // 导出函数符号,使之外部可见
int mysub(int x, int y) { return (x - y); } EXPORT_SYMBOL(mysub);
static int __init math_init(void) { printk(KERN_DEBUG "-----%s----%d.\n",__func__,__LINE__); return 0; } static void __exit math_exit(void) { printk(KERN_ERR "-----%s----%d.\n",__func__,__LINE__); } module_init(math_init); module_exit(math_exit); MODULE_LICENSE("GPL");
demo.c驱动程序
#include <linux/module.h> // 声明外部符号 extern int myadd(int x, int y); extern int mysub(int x, int y); static int __init demo_init(void) { printk(KERN_DEBUG " init %s---- %d\n",__func__,__LINE__); // 加载模块时打印 printk(" %d ---\n ",myadd(6,8)); printk(" %d -- \n ",mysub(9,2)); return 0; } static void __exit demo_exit(void) { printk(KERN_INFO" exit %s --- %d\n",__func__,__LINE__); } module_init(demo_init); module_exit(demo_exit); MODULE_LICENSE("GPL");
使用同一架构下编译这两个模块,matn.c 编译生成 math.ko 模块,demo.c 编译生成 demo.ko 模块,demo 模块中,使用了math.ko 模块中的函数(符号),这就要先加载math.ko模块(先加载依赖模块),然后在加载demo.ko模块。
在安装math.ko 模块后,安装demo.ko 模块依旧报错
安装demo.ko模块提示错误:insmod: ERROR: could not insert module demo.ko: Invalid parameters
这是因为demo.ko目录下的符号表 Module.symvers 没有math.ko导出的符号;
把math目录下的符号表拷贝到demo目录下,然后重新make下,demo.ko就可以正常使用math模块导出的符号了