gccはlinuxのC++例外のスタック展開をどのように実装しますか?特に、フレームをアンロールするときに呼び出すデストラクタ(つまり、どのような情報が格納され、どこに格納されるのか)をどのように知るのですか?gccはlinuxのC++例外のスタック展開をどのように実装しますか?
答えて
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ソースコードにあります。
これは、Itaniumのためになりそうだが、おそらく実装はx86用と似ています。exception handling ABI
現在入手可能な多くの文書がありません、しかし、基本的なシステムはGCCが、その後function callsにキャッチ/しようとしたブロックを変換していることですlinks in a library with the needed runtime support(documentation about the tree building codeには、「例外を投げることは関数を呼び出すことによって実装されるため、GIMPLEで直接表現されません」という文が含まれています)。
残念ながら私はこれらの機能に精通しておらず、何を見てもわかりません(例外処理ランタイムを含むlibgccのソース以外)。
"Exception Handling for Newbies"ドキュメントがあります。
- 1. MEANスタックとは対照的に、MEANスタックwebAppをどのように展開しますか?
- 2. パンダのデータフレームをどのように展開/展開しますか?
- 3. Cマクロの展開はどのように機能しますか?
- 4. SharePoint展開サービスは実際にどのように機能しますか?
- 5. tcp/ipスタックはどのようにLinuxのnet_deviceインターフェースを取得しますか
- 6. インライン展開の実装
- 7. F#Azure WebJobはどのように展開しますか?
- 8. C#契約の実装と例外
- 9. どのようにALTER TABLEを実装するかの例
- 10. gccはlinux ELFにどのような機能を追加しますか?
- 11. chshはどのようにlinuxに実装されていますか?
- 12. ノードC++アドオンで動的ライブラリをどのように展開しますか?
- 13. どのようにC#でIRandomAccessStreamを実装できますか?
- 14. GreenPlumは外部テーブルをどのように実装していますか?
- 15. REG_EXPAND_SZをバッチファイルでどのように展開しますか?
- 16. プロダクションでcronスクリプトをどのように展開しますか?
- 17. Rubyの実行スタックはどのように見えますか?
- 18. スケーラブルなzipkin展開をどのように展開できますか?
- 19. Linuxカーネルでpercpuポインタはどのように実装されていますか?
- 20. linuxではclock_gettimeがどのように実装されていますか?
- 21. pthreadはLinuxカーネル3.2でどのように実装されていますか?
- 22. 反応容器にjsPdfのhtml2pdfを実装したいと思います。どのように実装できますか?どのような例ですか?
- 23. logging.exceptionはどのように例外を保持しますか?
- 24. Linuxソケットの実装はどこですか? Cプログラムで
- 25. Terminal LinuxでgccのようなCMDで.cプログラムをコンパイルしますか?
- 26. C++ 17例外指定型システムはどのように機能しますか?
- 27. Chromeのジオロケーションプロンプトダイアログは、どのように実装しますか?
- 28. LAMPプロジェクトの "ワンステップビルド"はどのように実装しますか?
- 29. AWSのWebSocket実装によるWebサービスの青緑の展開
- 30. socket.ioは認証をどのように実装しますか
可能な限り、GCCはItanium ABIに準拠しています。これには、x86とx86-64が含まれます。 – Branan