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