模組匯出符號
Linux核心標頭檔提供了一個方便的方法用來管理符號的對模組外部的可見度,因此減少了命名空間的汙染(命名空間的名稱可能會與核心其他地方定義的名稱衝突),並且適當資訊隱藏。 如果你的模組需要輸出符號給其他模組使用,應當使用下面的宏定義:
EXPORT_SYMBOL(name);
EXPORT_SYMBOL_GPL(name);
這兩個宏均用於將給定的符號匯出到模組外. _GPL版本的宏定義只能使符號對GPL許可的模組可用。 符號必須在模組檔案的全域部分匯出,不能在函數中匯出,這是因為上述這兩個宏將被擴充成一個特殊用途的聲明,而該變數必須是全域的。這個變數儲存於模組的一個特殊的可執行部分(一個"ELF段" ),在裝載時,核心通過這個段來尋找模組匯出的變數(感興趣的讀者可以看<linux/module.h>獲知更詳細的資訊)。
通俗的講就是:如果你的module的協議不是GPL, 那麼EXPORT_SYMBOL_GPL匯出的那些符號,你就不能用。
轉自嵌入式學習網。
原文地址:http://www.embedstudy.com/viewnews-8459
在linux/module.h中
/* For every exported symbol, place a struct in the __ksymtab section */
#define __EXPORT_SYMBOL(sym, sec) \
extern typeof(sym) sym; \
__CRC_SYMBOL(sym, sec) \
static const char __kstrtab_##sym[] \
__attribute__((section("__ksymtab_strings"), aligned(1))) \
= MODULE_SYMBOL_PREFIX #sym; \
static const struct kernel_symbol __ksymtab_##sym \
__used \
__attribute__((section("__ksymtab" sec), unused)) \
= { (unsigned long)&sym, __kstrtab_##sym }
#define EXPORT_SYMBOL(sym) \
__EXPORT_SYMBOL(sym, "")
#define EXPORT_SYMBOL_GPL(sym) \
__EXPORT_SYMBOL(sym, "_gpl")
#define EXPORT_SYMBOL_GPL_FUTURE(sym) \
__EXPORT_SYMBOL(sym, "_gpl_future")