2012-03-23 129 views
32

hereLinux內核代碼中「EXPORT_SYMBOL」的含義是什麼?

48 struct snd_card *snd_cards[SNDRV_CARDS]; 
49 EXPORT_SYMBOL(snd_cards); 

我沒有得到什麼它的含義,這是爲什麼使用。我試圖搜索它,但不瞭解其含義。

+1

http://stackoverflow.com/questions/6670589/use-of-export-symbol可能是有用的 – Bart 2012-03-23 09:10:30

+0

關於這方面的出色信息可以在[聽](http://tuxthink.blogspot.in/2011/ 07/exporting-symbols-from-module.html) – 2013-06-20 11:09:28

+0

最小運行示例:https://stackoverflow.com/a/44614246/895245 – 2017-06-18 11:06:30

回答

33

它使一個符號可以被動態加載模塊訪問(假定所述模塊添加了一個extern聲明)。

不久前,someone asked how to use it

+1

它在哪裏定義?它是如何工作的? – 2013-08-30 12:48:42

+0

@cirosantilli它在'include/linux/export.h'中定義。尋找'ksymtab'和'kstrtab'。 – cnicutar 2013-08-30 12:51:41

+0

任何人都知道在什麼版本的內核/include/linux/export.h被添加?(或者一個簡單的方法來檢查,而不通過每一個內核源代碼樹)我沒有看到它在2.6.39.4。 – sager89 2014-03-12 22:37:48

3

根據我的評論,答案本身並不是一個答案,而是一個示範,導出的符號不是必須是非靜態的。下面2個模塊證明這一點:內核2.6.32和3.10(分別):

/* mod1.c */ 
#include <linux/module.h> 

static int mod1_exp_func(int i) 
{ 
    pr_info("%s:%d the value passed in is %d\n", 
      __func__, __LINE__, i); 

    return i; 
} 
EXPORT_SYMBOL(mod1_exp_func); /* export static symbol */ 

static int __init mod1_init(void) 
{ 
    pr_info("Initializing simple mod\n"); 
    return 0; 
} 

static void __exit mod1_exit(void) 
{ 
    pr_info("This module is exiting\n"); 
} 

module_init(mod1_init); 
module_exit(mod1_exit); 
MODULE_LICENSE("GPL v2"); 

和第二模塊

/* mod2.c */ 
#include <linux/module.h> 

extern int mod1_exp_func(int); 

static int __init mod2_init(void) 
{ 
    pr_info("Initializing mod2\n"); 
    pr_info("Calling exported function in mod1\n"); 
    mod1_exp_func(3); 
    return 0; 
} 

static void __exit mod2_exit(void) 
{ 
    pr_info("mod2 exiting\n"); 
} 

module_init(mod2_init); 
module_exit(mod2_exit); 
MODULE_LICENSE("GPL v2"); 

這些被在CentOS 6個& CentOS的7測試。加載mod1.ko然後mod2.ko將導致傳遞給mod1_exp_func()的值被打印到內核日誌緩衝區。

+1

如果函數是非靜態的,它會工作嗎?因爲我試圖讓函數不是靜態的,而其中一個文件存在於一個子目錄中,所以讓這個模塊發出一個警告,說明子目錄中存在的模塊中導出的函數是未定義的。當我將定義變爲靜態時,它就起作用了。 – 2016-12-04 16:47:08

相關問題