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

kernel exported symbols vs global symbols vs static global?

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

可以从可加载模块访问内核导出的符号。在内核中触摸这样的符号是好的风格吗? 当内核解析符号时,它是通过内核符号查找 table?

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

实现有点复杂。此 internalexternal linkage 规则仅适用于静态 ld 链接器,它在构建 vmlinux 或内核模块时起作用.通常带有 external linkage 的符号被添加到 symtab ELF 部分,当动态链接器 ld.so 加载 shared object 时,它读取部分。

但是当加载模块时 Linux 内核使用单独的符号 table ksymtabEXPORT_SYMBOL() 向 table 添加符号,但此过程对编译器链接器工具链是完全透明的,因此它与 internalexternal 无关根本没有联系