export_symbol 变量
时间: 2023-08-29 10:10:33 浏览: 92
高版本linux的EXPORT-SYMBOL共享变量通过extern 导入编译出现 undefined 错误解决
`export_symbol` 是一个宏,用于在 Linux 内核模块中导出一个符号(函数或变量),使得其他模块可以使用该符号。它的定义如下:
```c
#define export_symbol(sym) \
extern typeof(sym) sym __attribute__((__visibility__("default")))
```
这里的 `sym` 表示要导出的符号名。使用该宏定义的变量或函数,可以被其他模块通过 `EXPORT_SYMBOL` 宏或 `kernel_symbol()` 函数引用。例如:
```c
// 在 foo.c 中定义一个变量,并导出
#include <linux/module.h>
#include <linux/init.h>
int foo_var = 42;
export_symbol(foo_var);
static int __init foo_init(void)
{
printk(KERN_INFO "foo_var = %d\n", foo_var);
return 0;
}
static void __exit foo_exit(void)
{
printk(KERN_INFO "Goodbye, cruel world\n");
}
module_init(foo_init);
module_exit(foo_exit);
MODULE_LICENSE("GPL");
```
在另一个模块中,可以通过 `extern` 关键字声明该变量并使用:
```c
// 在 bar.c 中使用 foo.c 中定义的变量
#include <linux/module.h>
#include <linux/init.h>
extern int foo_var;
static int __init bar_init(void)
{
printk(KERN_INFO "foo_var = %d\n", foo_var);
return 0;
}
static void __exit bar_exit(void)
{
printk(KERN_INFO "Goodbye, cruel world\n");
}
module_init(bar_init);
module_exit(bar_exit);
MODULE_LICENSE("GPL");
```
需要注意的是,`export_symbol` 宏只能用于导出全局变量或函数,不能用于导出局部变量或函数。此外,导出的符号名必须是唯一的,否则会导致链接错误。
阅读全文