從hereLinux內核代碼中「EXPORT_SYMBOL」的含義是什麼?
48 struct snd_card *snd_cards[SNDRV_CARDS];
49 EXPORT_SYMBOL(snd_cards);
我沒有得到什麼它的含義,這是爲什麼使用。我試圖搜索它,但不瞭解其含義。
從hereLinux內核代碼中「EXPORT_SYMBOL」的含義是什麼?
48 struct snd_card *snd_cards[SNDRV_CARDS];
49 EXPORT_SYMBOL(snd_cards);
我沒有得到什麼它的含義,這是爲什麼使用。我試圖搜索它,但不瞭解其含義。
它使一個符號可以被動態加載模塊訪問(假定所述模塊添加了一個extern
聲明)。
根據我的評論,答案本身並不是一個答案,而是一個示範,導出的符號不是必須是非靜態的。下面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()的值被打印到內核日誌緩衝區。
如果函數是非靜態的,它會工作嗎?因爲我試圖讓函數不是靜態的,而其中一個文件存在於一個子目錄中,所以讓這個模塊發出一個警告,說明子目錄中存在的模塊中導出的函數是未定義的。當我將定義變爲靜態時,它就起作用了。 – 2016-12-04 16:47:08
http://stackoverflow.com/questions/6670589/use-of-export-symbol可能是有用的 – Bart 2012-03-23 09:10:30
關於這方面的出色信息可以在[聽](http://tuxthink.blogspot.in/2011/ 07/exporting-symbols-from-module.html) – 2013-06-20 11:09:28
最小運行示例:https://stackoverflow.com/a/44614246/895245 – 2017-06-18 11:06:30