2008-09-17 10 views

答えて

12

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

gccが発行するELFバイナリには、主に2つのセクションがあり、例外処理の対象となります。それらは.eh_frame.gcc_except_tableです。

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

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

残りの情報は、実際のコードがこれらのデータセクションにある情報を解釈するものです。関連するコードはlibstdC++とlibgccにあります。私は作品がどの瞬間に生きているのか覚えていない。 DWARF呼び出しフレーム情報のインタプリタは、gcc/unwind-dw.cファイルのgccソースコードにあります。

2

これは、Itaniumのためになりそうだが、おそらく実装はx86用と似ています。exception handling ABI

+0

可能な限り、GCCはItanium ABIに準拠しています。これには、x86とx86-64が含まれます。 – Branan

2

現在入手可能な多くの文書がありません、しかし、基本的なシステムはGCCが、その後function callsにキャッチ/しようとしたブロックを変換していることですlinks in a library with the needed runtime supportdocumentation about the tree building codeには、「例外を投げることは関数を呼び出すことによって実装されるため、GIMPLEで直接表現されません」という文が含まれています)。

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

"Exception Handling for Newbies"ドキュメントがあります。

関連する問題