我是有点堆叠的核心符号类型的意义。简单的静态符号具有与C静态符号相同的含义。因此,局部静态变量具有局部范围和静态分配。静态函数作用域是一个文件。但是静态输出的符号呢?如何处理EXPORT_SYMBOL()
、EXPORT_PER_CPU_SYMBOL()
、EXPORT_UNUSED_SYMBOL()
宏导出静态符号?全球符号和输出符号之间有什么区别?添加导出符号的附加信息是链接器的责任吗?全局静态变量内置内核在所有内核和可加载模块中可见吗?
可以从可加载模块访问内核导出的符号。好的风格在内核里触摸这样的符号吗。当内核解析符号时,是否通过内核符号表进行查找?
发布于 2015-03-25 23:22:12
概念上是,使用带有函数声明的static
关键字意味着内部链接--因此这种函数只能在单个翻译单元(*.o文件)中可见。这可能涉及到该函数的内联(在这种情况下,它将无法进一步使用),但是由于EXPORT_SYMBOL()
使用静态函数的地址,编译器应该禁用内联优化。
Implementation则要复杂一些。这种内部和外部链接规则仅适用于静态ld
链接器,当构建vmlinux
或内核模块时,静态链接器可以工作。通常,带有外部链接的符号被添加到symtab
ELF部分,当动态链接器ld.so
加载共享对象时,它会读取该部分。
但是当加载模块时,Linux使用单独的符号表ksymtab
。EXPORT_SYMBOL()
为该表添加了符号,但是这个过程对编译器链接器工具链是完全透明的,因此它与内部和外部链接完全无关。
https://stackoverflow.com/questions/29267122
复制相似问题