ELF 的堆栈大小元数据有什么用途?

ELF 的堆栈大小元数据有什么用途?

我正在阅读《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)。

并进一步在这方面博客条目,《实现静态堆栈使用分析工具》。此处提供了用于此操作的工具(带锈)

相关内容