内核模块符号导出

简介: 内核模块符号导出

内核符号表引入

驱动程序可以编译成内核模块,也就是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");

结果


目录
相关文章
|
存储
设备树dtb文件的格式分析
设备树dtb文件的格式分析
228 0
|
1月前
crash —— 获取内核和模块的符号
crash —— 获取内核和模块的符号
|
4月前
|
Linux 数据处理 vr&ar
Linux下的ranlib命令:静态库文件的索引生成器
`ranlib`是Linux用于加速静态库(.a文件)链接的工具,它生成索引以优化查找目标文件。当链接器处理静态库时,索引能快速定位目标,提升效率。命令如`ranlib libexample.a`创建索引。注意,新工具链可能已自动包含此功能,使用前应确保库文件未含索引,避免重复生成。
|
5月前
|
NoSQL 编译器 vr&ar
GNU objcopy命令的探索:(转换二进制文件)
GNU objcopy命令的探索:(转换二进制文件)
278 1
|
5月前
3-3 51单片机头文件区分以及模板文件创建
3-3 51单片机头文件区分以及模板文件创建
43 0
|
5月前
|
存储 Shell Linux
【Shell 命令集合 备份压缩 】Linux 将二进制文件转换为ASCII码 uuencode命令 使用指南
【Shell 命令集合 备份压缩 】Linux 将二进制文件转换为ASCII码 uuencode命令 使用指南
72 0
|
5月前
|
算法 网络协议 Linux
Linux模块文件编译到内核与独立编译成.ko文件的方法
Linux模块文件编译到内核与独立编译成.ko文件的方法
1190 0
|
Linux Perl
Linux 中如何对变量进行切分截取?获取文件的扩展名
Linux 中如何对变量进行切分截取?获取文件的扩展名
107 0
|
Linux C++ 编译器
linux下查看包含的头文件的源文件
我想查看linux下包含的一个头文件的源文件,如#include "a.h"。在C++编译器里直接右键就可以打开了,那么在linux下该怎么查看呢?或者怎么查看源文件所在的目录? 如果是系统的文件,那么到 cd /usr/include 下找找就行; 如果是自定义的头文件,到你的工程的根目录下找找。
1133 0