19

gccはLinuxでC++例外のスタック展開をどのように実装しますか?特に、フレームを展開するときにどのデストラクタを呼び出すか(つまり、どのような種類の情報が保存され、どこに保存されているか)をどのように知るのでしょうか。

4

3 に答える 3

13

x86_64 ABIのセクション 6.2 を参照してください。これはインターフェースの詳細を示していますが、基礎となるデータの多くは示していません。これは C++ からも独立しており、おそらく他の目的にも使用できます。

gcc によって生成される ELF バイナリには、主に 2 つのセクションがあり、例外処理に関係があります。.eh_frameとです.gcc_except_table

.eh_frameDWARF 形式 (gdb を使用しているときに主に使用されるデバッグ形式) に従います。.debug_frameでコンパイルしたときに出力されるセクションとまったく同じ形式です-g。基本的に、コール スタックの上位の任意の時点で、マシン レジスタとスタックの状態にポップ バックするために必要な情報が含まれています。詳細については、dwarfstd.org の Dwarf Standard を参照してください。

.gcc_except_table例外処理の「ランディング パッド」とハンドラの場所に関する情報が含まれています。これは、巻き戻しを停止するタイミングを知るために必要です。残念ながら、このセクションは十分に文書化されていません。私が収集できた情報の断片は、gcc メーリング リストからのものだけです。特にこの投稿を参照してください

残りの情報は、実際のコードがこれらのデータ セクションで見つかった情報を解釈するものです。関連するコードは libstdc++ と libgcc にあります。どのピースがどのピースに住んでいるのか、今は思い出せません。DWARF 呼び出しフレーム情報のインタープリターは、ファイル gcc/unwind-dw.c の gcc ソース コードにあります。

于 2010-12-22T03:59:47.773 に答える
3

これは Itanium 用のように見えますが、おそらく x86 の実装も同様です:例外処理 ABI

于 2008-09-17T21:10:14.467 に答える
3

現在利用可能なドキュメントはあまりありませんが、基本的なシステムは、GCC が try/catch ブロックを関数呼び出しに変換し、必要なランタイム サポートを含むライブラリにリンクすることです(ツリー構築コードに関するドキュメントには、「例外をスローすることは関数を呼び出すことで実装されているため、GIMPLE では直接表現されません」)。

残念ながら、私はこれらの関数に精通しておらず、何を見ればよいかわかりません (例外処理ランタイムを含む libgcc のソース以外)。

初心者のための例外処理」ドキュメントが利用可能です。

于 2008-09-17T22:24:56.130 に答える