首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >内核导出符号还是全局符号与静态全局符号?

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

Stack Overflow用户
提问于 2015-03-25 21:44:16
回答 1查看 1.3K关注 0票数 3

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-25 23:22:12

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

Implementation则要复杂一些。这种内部和外部链接规则仅适用于静态ld链接器,当构建vmlinux或内核模块时,静态链接器可以工作。通常,带有外部链接的符号被添加到symtab ELF部分,当动态链接器ld.so加载共享对象时,它会读取该部分。

但是当加载模块时,Linux使用单独的符号表ksymtabEXPORT_SYMBOL()为该表添加了符号,但是这个过程对编译器链接器工具链是完全透明的,因此它与内部和外部链接完全无关。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29267122

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档