2012-03-23 83 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

相关问题