linux模組匯出符號EXPORT_SYMBOL與EXPORT_SYMBOL_GPL的區別__linux

來源:互聯網
上載者:User

模組匯出符號
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")

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.