gcc は Linux 上で C++ 例外のスタック展開をどのように実装しますか?

StackOverflow https://stackoverflow.com/questions/87220

  •  01-07-2019
  •  | 
  •  

質問

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

役に立ちましたか?

解決

セクション 6.2 を参照してください。 x86_64 ABI. 。ここではインターフェイスについて詳しく説明しますが、基礎となるデータについてはあまり詳しく説明しません。これも C++ から独立しているため、他の目的にも使用できる可能性があります。

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

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

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

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

他のヒント

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

残念ながら、私はこれらの関数に詳しくないので、何を参照すればよいのかを説明できません (例外処理ランタイムを含む libgcc のソース以外)。

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top