EXPORT_SYMBOL_GPL
时间: 2023-06-23 14:54:10 浏览: 106
`EXPORT_SYMBOL_GPL` 是 Linux 内核中用来导出符号的一个宏定义。它的作用是将一个符号(例如函数、变量等)导出为 GPL 许可证下可用的全局符号,以便其他内核模块可以使用该符号。使用 `EXPORT_SYMBOL_GPL` 宏定义需要注意以下几点:
1. 只有在使用 GPL 许可证的内核模块中才能使用 `EXPORT_SYMBOL_GPL`,因为该宏定义导出的符号只能在与内核相同的 GPL 许可证下使用。
2. `EXPORT_SYMBOL_GPL` 后面必须紧跟着要导出的符号的名称,例如:
```
void my_func(void);
EXPORT_SYMBOL_GPL(my_func);
```
3. `EXPORT_SYMBOL_GPL` 一般用于导出函数符号,但也可以用于导出变量符号,例如:
```
int my_var;
EXPORT_SYMBOL_GPL(my_var);
```
4. `EXPORT_SYMBOL_GPL` 会将要导出的符号添加到内核的符号表中,使得其他内核模块可以使用该符号。
总之,`EXPORT_SYMBOL_GPL` 宏定义是 Linux 内核中用于导出符号的重要机制之一,它可以使得内核模块之间可以方便地共享函数、变量等符号。
相关问题
EXPORT_SYMBOL_GPL和EXPORT_SYMBOL有什么区别
在Linux内核开发中,EXPORT_SYMBOL和EXPORT_SYMBOL_GPL是用于导出符号(函数或变量)的宏。
- EXPORT_SYMBOL是用于将符号导出为公共符号,可以被内核模块和其他驱动程序使用。这意味着,无论内核模块的许可证类型是什么,都可以使用这个导出的符号。
- EXPORT_SYMBOL_GPL则将符号导出为GPL许可证的符号。它只能被使用GPL许可证的内核模块和驱动程序使用。如果一个内核模块或驱动程序使用了EXPORT_SYMBOL_GPL导出的符号,那么它自身也必须使用GPL许可证。
因此,EXPORT_SYMBOL可以被任何类型的内核模块和驱动程序使用,而EXPORT_SYMBOL_GPL只能被使用GPL许可证的内核模块和驱动程序使用。选择使用哪种导出符号的宏取决于符号的许可证要求和对代码的开放程度要求。
EXPORT_SYMBOL_GPL怎么实现的
EXPORT_SYMBOL_GPL是通过宏的形式实现的,其定义如下:
```
#ifdef CONFIG_UNUSED_SYMBOLS
# define __EXPORT_UNUSED_SYMBOL(sym, sec) \
extern typeof(sym) sym __attribute__((unused, section(sec)))
#else
# define __EXPORT_UNUSED_SYMBOL(sym, sec) \
extern typeof(sym) sym __attribute__((section(sec)))
#endif
#ifdef CONFIG_UNUSED_SYMBOLS
#define __EXPORT_SYMBOL(sym, sec) \
__EXPORT_UNUSED_SYMBOL(sym, #sec)
#else
#define __EXPORT_SYMBOL(sym, sec) \
extern typeof(sym) sym __attribute__((section(sec)))
#endif
#define EXPORT_SYMBOL(sym) \
__EXPORT_SYMBOL(sym, "")
#define EXPORT_SYMBOL_GPL(sym) \
__EXPORT_SYMBOL(sym, "__ksymtab_gpl")
```
EXPORT_SYMBOL_GPL宏实际上是调用了__EXPORT_SYMBOL宏,将符号导出到__ksymtab_gpl节中。__EXPORT_SYMBOL宏通过使用GCC的__attribute__机制,将符号声明为一个具有指定节名称的全局变量。在链接时,这些符号将被放置在相应的节中,使得其他模块可以访问这些符号。
需要注意的是,EXPORT_SYMBOL_GPL宏只能被GPL协议的模块使用,这是通过内核Makefile文件中的CONFIG_UNUSED_SYMBOLS配置选项来实现的。如果该选项被启用,导出的符号将被标记为未使用,如果未启用,则不会标记为未使用。这样可以保证只有GPL协议的模块才能使用导出的符号,防止非GPL协议的模块使用导出的符号。