EXPORT_SYMBOL_GPL怎么实现的
时间: 2023-11-28 19:04:28 浏览: 156
嵌入式系统/ARM技术中的Linux内核中EXPORT_SYMBOL的用法
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协议的模块使用导出的符号。
阅读全文