内核导出符号与全局符号与静态全局符号?
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()
获取静态函数的地址,编译器应禁用内联优化。
实现有点复杂。此 internal 和 external linkage 规则仅适用于静态 ld
链接器,它在构建 vmlinux
或内核模块时起作用.通常带有 external linkage 的符号被添加到 symtab
ELF 部分,当动态链接器 ld.so
加载 shared object 时,它读取部分。
但是当加载模块时 Linux 内核使用单独的符号 table ksymtab
。 EXPORT_SYMBOL()
向 table 添加符号,但此过程对编译器链接器工具链是完全透明的,因此它与 internal 和 external 无关根本没有联系。
我有点堆栈内核符号类型的含义。
简单的静态符号与 C static 具有相同的含义。所以局部静态变量具有局部作用域和静态分配。静态函数范围是一个文件。但是静态导出的符号呢?如果宏导出静态符号,如何处理EXPORT_SYMBOL()
、EXPORT_PER_CPU_SYMBOL()
、EXPORT_UNUSED_SYMBOL()
?全局符号和导出符号有什么区别?链接器有责任为导出的符号添加附加信息吗?全局静态变量内置内核在所有内核和可加载模块中是否可见?
可以从可加载模块访问内核导出的符号。在内核中触摸这样的符号是好的风格吗? 当内核解析符号时,它是通过内核符号查找 table?
概念上,在函数声明中使用static
关键字意味着内部链接——所以这样的函数只在单个函数中可见翻译单元(*.o 文件)。这可能涉及该函数的内联(在这种情况下它将无法进一步使用),但由于 EXPORT_SYMBOL()
获取静态函数的地址,编译器应禁用内联优化。
实现有点复杂。此 internal 和 external linkage 规则仅适用于静态 ld
链接器,它在构建 vmlinux
或内核模块时起作用.通常带有 external linkage 的符号被添加到 symtab
ELF 部分,当动态链接器 ld.so
加载 shared object 时,它读取部分。
但是当加载模块时 Linux 内核使用单独的符号 table ksymtab
。 EXPORT_SYMBOL()
向 table 添加符号,但此过程对编译器链接器工具链是完全透明的,因此它与 internal 和 external 无关根本没有联系。