繁体   English   中英

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

[英]kernel exported symbols vs global symbols vs static global?

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

可以从可加载模块访问内核导出的符号。 在内核中触摸此类符号是否是好的样式。 当内核解析符号时,它会通过内核符号表进行查找吗?

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

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

但是,在模块加载时,Linux内核使用单独的符号表ksymtab EXPORT_SYMBOL()在该表中添加了符号,但是此过程对于编译器链接程序工具链是完全透明的,因此它根本与内部外部链接无关。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM