![ELFのスタックサイズメタデータはどのように使用されますか?](https://linux33.com/image/206457/ELF%E3%81%AE%E3%82%B9%E3%82%BF%E3%83%83%E3%82%AF%E3%82%B5%E3%82%A4%E3%82%BA%E3%83%A1%E3%82%BF%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AF%E3%81%A9%E3%81%AE%E3%82%88%E3%81%86%E3%81%AB%E4%BD%BF%E7%94%A8%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%E3%81%8B%EF%BC%9F.png)
私は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など)をオプトアウトできます。
そしてさらに、この点でブログエントリ、「分析ツールを使用した静的スタックの実装」。これを行うツールはここで利用できます(錆を含む)。