内核导出符号vs全局符号vs静态全局?

时间:2015-03-25 21:44:17

标签: c linux linux-kernel

我与内核符号类型含义有点叠加。 简单的静态符号与C static具有相同的含义。因此局部静态变量具有局部范围和静态分配。静态函数作用域是一个文件。但静态导出符号呢?如果宏导出静态符号,如何处理EXPORT_SYMBOL()EXPORT_PER_CPU_SYMBOL()EXPORT_UNUSED_SYMBOL()?全局符号和导出符号有什么区别?链接器是否有责任为导出的符号添加其他信息?全局静态变量内置内核是否在所有内核和可加载模块中都可见?

可以从可加载模块访问内核导出符号。内核中的这种符号是否很好用? 当内核解析符号时,它是通过内核符号表进行查找吗?

1 个答案:

答案 0 :(得分:5)

从概念上来说,使用带有函数声明的static关键字意味着内部链接 - 所以这样的功能只能在单个翻译单元中显示(* .o文件) 。这可能涉及内联函数(在这种情况下它将无法进一步使用),但由于EXPORT_SYMBOL()获取静态函数的地址,编译器应禁用内联优化。

实施有点复杂。此内部外部链接规则仅适用于在ld或内核模块构建时有效的静态vmlinux链接器。通常,带有外部链接的符号会添加到symtab ELF部分,当动态链接器ld.so加载共享对象时,它会读取该部分。

但是当加载模块时,Linux内核使用单独的符号表ksymtabEXPORT_SYMBOL()为该表添加符号,但此过程对编译器 - 链接器工具链完全透明,因此它与内部外部链接完全无关。 / p>