我正在阅读《Rust Unstable》这本书,我看到了一个新功能emit-stack-sizes
,
rustc 标志
-Z emit-stack-sizes
使 LLVM 发出堆栈大小元数据。
它接着说
注意:此 LLVM 功能仅支持 LLVM 8.0 起的 ELF 对象格式。将此标志与使用其他对象格式(例如 macOS 和 Windows)的目标一起使用将导致它被忽略。
它似乎使用的 LLVM 功能是EmitStackSizeSection
选项。了解堆栈大小的目的是什么?工具用这个吗?这是 ELF 的官方功能吗?如果是,内核会使用它吗?这似乎被记录在.stack_sizes
、.rel.stack_sizes
和部分下的 ELF 元数据.rela.stack_sizes
答案1
这在此处有所概述原始 RFC,“[eRFC] 添加-Z emit-stack-sizes
”
最终目标是启用对堆栈使用情况的整个程序分析,以证明编译时不存在堆栈溢出。这种属性对于缺乏 MMU / MPU 且堆栈溢出可能损坏内存的系统非常重要。在具有堆栈溢出保护的系统中,此类证明可用于选择退出运行时检查(例如堆栈探测或 MPU)。
并进一步在这方面博客条目,《实现静态堆栈使用分析工具》。此处提供了用于此操作的工具(带锈)