内核模块符号导出

内核模块符号导出


文章目录

  • 内核模块符号导出
  • 内核符号表引入
  • 内核符号表导出
  • 实现
    • a.c
    • b.c


内核符号表引入

驱动程序可以编译成内核模块,也就是KO文件。每个KO文件是相互独立的,也就是说模块之间无法互相访问。但是在某些使用场、要互相访问,如B模块要用A模块中的函数。(B模块依赖于A模块)这时候我们要怎么做呢?
什么是符号表?
所谓“符号"就是内核中的函数名,全局变量名等。符号表就是用来记录这些“符号"的文件。

内核符号表导出

模块可以使用一下宏EXPORT_SYMBOL和EXPORT_SYMBOL_GPL导出符号到内核符号表中。
如:

EXPORT_SYMBOL(符号名);
EXPORT_SYMBOL_GPL(符号名);//只适用于包含GPL许可的模块。

导出去的符号可以被其他模块使用。使用前只需要声明一下即可。

实现

a.c

#include <linux/module.h>
#include <linux/init.h>

extern int add_test(int a,int b);


 int add_test(int a,int b){


    return (a+b);
}
EXPORT_SYMBOL(add_test);

static int hello_init(void){

    printk("hello init!!!\n");
    return 0;

}


static void hello_exit(void){

    printk("hello exit!!!\n");
    

}
module_init(hello_init);
module_exit(hello_exit);
MODULE_AUTHOR("Paranoid");
MODULE_VERSION("V1.0");
MODULE_LICENSE("GPL");

查看符号表
在这里插入图片描述

编译被依赖的模块后,将生成的符号表文件复制到依赖模块所在文件夹,再编译另一个模块

b.c

#include <linux/module.h>
#include <linux/init.h>
extern int add_test(int a,int b);

static int hello_init(void){
    int a;
    a = add_test(1,2);
    printk("add:%d\n",a);
    printk("hello init!!!\n");
    return 0;

}


static void hello_exit(void){

    printk("hello exit!!!\n");
    

}
module_init(hello_init);
module_exit(hello_exit);
MODULE_AUTHOR("Paranoid");
MODULE_VERSION("V1.0");
MODULE_LICENSE("GPL");

结果

内核模块符号导出_第1张图片

你可能感兴趣的:(Linux驱动V2.0,#,内核模块,arm开发,linux,驱动开发,c语言,嵌入式)