我与内核符号类型含义有点叠加。
简单的静态符号与C static具有相同的含义。因此局部静态变量具有局部范围和静态分配。静态函数作用域是一个文件。但静态导出符号呢?如果宏导出静态符号,如何处理EXPORT_SYMBOL()
,EXPORT_PER_CPU_SYMBOL()
,EXPORT_UNUSED_SYMBOL()
?全局符号和导出符号有什么区别?链接器是否有责任为导出的符号添加其他信息?全局静态变量内置内核是否在所有内核和可加载模块中都可见?
可以从可加载模块访问内核导出符号。内核中的这种符号是否很好用? 当内核解析符号时,它是通过内核符号表进行查找吗?
答案 0 :(得分:5)
从概念上来说,使用带有函数声明的static
关键字意味着内部链接 - 所以这样的功能只能在单个翻译单元中显示(* .o文件) 。这可能涉及内联函数(在这种情况下它将无法进一步使用),但由于EXPORT_SYMBOL()
获取静态函数的地址,编译器应禁用内联优化。
实施有点复杂。此内部和外部链接规则仅适用于在ld
或内核模块构建时有效的静态vmlinux
链接器。通常,带有外部链接的符号会添加到symtab
ELF部分,当动态链接器ld.so
加载共享对象时,它会读取该部分。
但是当加载模块时,Linux内核使用单独的符号表ksymtab
。 EXPORT_SYMBOL()
为该表添加符号,但此过程对编译器 - 链接器工具链完全透明,因此它与内部和外部链接完全无关。 / p>