おしながき

ELFファイルフォーマット

  • .eh_frameセクションの構造と読み方

DWARFファイルフォーマット

NCURSESライブラリ

  • NCURSES Programing HOWTO ワタクシ的ほんやく
    1. Tools and Widget Libraries
    2. Just For Fun !!!
    3. References
  • その他、自分メモ
  • NCURSES雑多な自分メモ01


最近の更新 (Recent Changes)

2019-09-24
2013-10-10
2013-10-03
2013-10-01
2013-09-29
目次に戻る:DWARFファイルフォーマット

TAG詳細(その05) 仲介関数、語彙ブロック、gotoラベル、with文編 ※lexical_block、label、with_stmt

このページは、なんかごちゃまぜなんですが。。。それもそのはずで、原文3章のちっちゃなセクションの解説で、グルーピング難しいもん、まとめちゃいました。。。
ということで、以下関連なっしんぐですが、まぁということで。

仲介関数(Trampolines)

「仲介関数(Trampolines)」って何?が大半だと思うのです。ということで、まずそこから。

仲介関数(Trampoline)は、他の関数/サブルーチンなどを呼び出す際の手段として、コンパイラが自動的に生成する関数/サブルーチンを指す

そうです。例としては、呼び出し方や呼び出す際のデータの引渡し方法を、呼び出す先の関数/サブルーチンに合わせるために、引数や戻り値を調整するようなパターンみたいです。

※ちなにみ、原文上は”Trampoline”です。「仲介関数」はワタクシが英和時点から勝手に訳して付けた言葉です。よって日本語的に「仲介関数」が正しいかどうか、知りません。ので、以下では”Trampolineルーチン”で統一します。


で、このTrampolineルーチンのDWARF表現を見て行きます。

  • Trampolineルーチンは、「DW_TAG_subprogram」「DW_TAG_inlined_subroutine」のいずれかとして表現されます。つまり、ふつーの関数と同じ扱いです。
    • 但し、こいつが”Trampolineルーチン”であることの明示として、「DW_AT_trampoline」なAttributeを持っています。
    • 別途のAttributeとして、コンパイラが自動で作ったかどうかを示す「DW_AT_artifical」というのがいますが、”Trampolineルーチン”の場合は、コンパイラが自動で作っていても、この属性は不要です。(その代わりに、DW_AT_trampolineがあるので)
  • 「DW_AT_trampoline」なAttributeは、こいつが仲介して最終的に呼び出す関数/サブルーチンを指しています。
    • 「DW_AT_trampoline」の値は、そのデータクラス(DW_FORM_zzzzの内容)から、以下4パターンあります。
      パターン番号 データクラス名 意味
      パターン1 reference 仲介して最終的に呼び出す関数/サブルーチンのDIE(DW_TAG_subprogram/DW_TAG_inlined_subroutine」への参照
      パターン2 address 仲介して最終的に呼び出す関数/サブルーチンの再配置後のマシン命令アドレス
      パターン3 string 仲介して最終的に呼び出す関数/サブルーチンのソース上での名称
      (なお、C++の様に関数/サブルーチン名をコンパイラが調整/加工する言語の場合は、加工後の名前が一般的に使われる)
      パターン4 flag ”Trampolineルーチン”が仲介して最終的に呼び出す関数/サブルーチンの中に組み込まれ、別関数/サブルーチンの枠組になっていないケースの場合、”true”となる。


なお、以下は”Trampolineルーチン”に関する原文記述の備考書きです。ご参考マデ。

  • C++では、virtualなメンバ関数を継承するための手法として使われてます
    • 一般的には、"this"ポインタ変数を暗黙の内に調整(実質、値の格納)するために使われています (へぇ〜ってかんじ)
  • 他の言語や環境でも、関数やベクタ(恐らくポインタのこと?)を変換する手段として知られています。
  • そのほか、Trampolineルーチンはcall命令の代替として、ブランチやジャンプの手段として使われていることがあるけど、この場合(デバッガでは?)実行中これらの存在を追いかけることはできない
  • DW_AT_trampolineは、デバッガがターゲットとする関数の代わりにTrampolineルーチンをStep Into実行したり、ブレークポイント掛けたりしないようにするために設けられている。(なるほど!)


語彙ブロック(Lexical Block)

語彙ブロックとは、恐らく、CやC++での{と}で括られる塊、のことです。(恐らく、と書いたのは、翻訳に自信がないためです。。。)
CやC++では、関数やif/for/whileなど、{と}を文法として要求するものの中に、文法としての要求はされないものの、ひとまとめにするという意味で{と}で括ったブロックを作ることができます。
語彙ブロックとは、恐らくだけど、この文法では要求されていないが、プログラマの趣味?でまとめた{と}の塊、のことだと思われます。
まぁ、詳細はちゃんと調査必要なんでしょけど、とりあえず、以下この前提で詳細です。

  • 語彙ブロックは、「DW_TAG_lexical_block」なTAGで表現されます。
    • このTAGは、おなじみ「DW_AT_low_pc & DW_AT_high_pc」か「DW_AT_ranges」を持っていて、語彙ブロックのマシン命令のアドレス範囲が書かれています
      (前者は範囲が連続、後者は不連続なため.debug_ranges参照要、というのもいつも通り)
    • 語彙ブロックが名前を持っている場合は、「DW_AT_name」なAttirbuteにソース上の語彙ブロック名を持っています。(とーぜんNULL終り文字列)
  • この「語彙ブロック」は、CやC++の「ラベル」ではないので注意! (それは、次の章デス)
  • 語彙ブロックのエントリ(DW_TAG_lexical_block)は、この語彙ブロックを含むDIEに所有されています。
    • C言語であれば、語彙ブロックは関数内にあるでしょうから、DW_TAG_lexical_blockはDW_TAG_subprogramの子DIEということになります。
  • 語彙ブロックのDIEは、語彙ブロック内でのローカルな宣言や、内包する語彙ブロックのDIEを子DIEとして持っています。


ラベル(Gotoラベル)

これは、ズバリC言語のGotoラベルです。

  • ラベルは、「DW_TAG_label」なタグでその情報を持ちます。
    • このTAGは、ソース内でこのラベルを(各言語の文法/解釈のルールにそった中で)参照することができるスコープに相当するDIEが所有します。
      • これは、C言語で、ある関数の{と}の中に直でラベル書いていたら、DW_TAG_subprogram。上の語彙ブロック内にラベル張っていたら、DW_TAG_lexical_blockになると思われますです。
    • DW_AT_low_pcな属性に、ソース上でのラベルの位置に相当する、マシン命令の最初の再配置後のアドレスを持っています
    • DW_nameな属性に、ソース上でのラベル名をNULLエンド文字列で持っています。


With句 (Pascal/Modula2)

これは、Pascal/Modula2言語での”With句”の表現方法です。

※スミマセンが、PascalもModula2も、ワカラナイので、以下とりあえずの直訳メモです。
  • ”With句”は、「DW_TAG_with_stmt」なTAGで表現されます。
  • このタグは、以下のAttributeを持っています
    • 「DW_AT_low_pc & DW_AT_high_pc」か「DW_AT_ranges」
      • いつも通りですが、With句に相当する部分のマシン命令のコードアドレス範囲です。
    • 「DW_AT_type」
      • With句のブロックを省略せずに参照するフィールドのレコード型を示す。
    • 「DW_AT_location」
      • With句のブロックを参照するレコードオブジェクトのベースアドレスを検索する方法を示す。(これ、どう使われるのかがワカラナイです。直訳です)


目次に戻る:DWARFファイルフォーマット