おしながき

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詳細(その12) オブジェクト指向言語編2 (クラスのメンバ関数、クラステンプレート)

クラスのメンバ関数

クラス内でのメンバ関数は、「DW_TAG_subprogram」なTAGのDIEとして表現され、このDIEは、クラス自体のDIEの「子DIE」となります。
そして、(クラスのメンバではない、通常の)関数やサブルーチンと同じルールで表現され、持っているAttributeも同じとのことです。

が、やっぱりちょぴっと、Attributeには違いとか特徴あるみたいなので、以下表です。

No. Attribute名 せつめいじゃ
1 DW_AT_accessibility アクセス記述子の内容。
このAttribute、もし存在しなかったら。。。
* クラスの場合 → ”private”が宣言されている
* 構造体、unionの場合 → ”public”が宣言されている
前提になります。 ※が、構造体、unionにメンバ関数があることはないのです?というギモンあり。
2 DW_AT_virtuality メンバ関数が”virtual”指定されているならば、このAttributeを持っていて、それを示すです。
3 DW_AT_explicit メンバ関数が明確に宣言されたものである場合、このAttributeを持っていて、それを示すです。
4 DW_AT_vtable_elem_location (No.2で、virtual指定されているとされたものであった場合)
クラスが持つvirtual関数テーブルにある該当する関数のアドレスを指す「Location description」をもってます
5 DW_AT_object_pointer (メンバ関数(の引数)が固定したメモリ空間上に存在するもの(オブジェクト)でなければ)
このAttributeをもっていて、このメンバ関数の引数のDIEへの参照になります。
そして、参照される引数は、C++のthis、Obj-Cのselfなど、クラスオブジェクト次第で変動するようなモノになるみたいです。
※備考: このAttributeの参照先の引数のDIEは、DW_AT_artificialを持っていて、true になっているです。

なお、メンバ関数(の引数)が固定したメモリ空間上に存在する場合、このAttributeは持っていません。
また、メンバ関数のが「常に不安定」と宣言されているために静的でない場合は、メンバ関数の引数も「常に不安定」な型のものとして表現されます。
★特に、下2行はちょー直訳です。実際の言語の何に対応するのか、わかっていません。。。


また、メンバ関数の本体(メンバ関数の中身)が、そのメンバ関数の所属するクラス定義の外部で”クラス名::メンバ関数名”の名前を用いてなされている場合、以下の注意があるです。

※あ、ちなみに、とーぜんながらメンバ関数が所属するクラスの宣言内には、このメンバ関数の「プロトタイプ宣言相当」のものだけある認識です。(でないと、メンバになれないので)
  • (クラス外部で中身が定義されている)メンバ関数本体のDIEには。。。
    • DW_AT_specificationを持っていて、こいつはメンバ関数の所属するクラス宣言のDIEの子DIEとして存在する、このメンバ関数の「プロトタイプ宣言相当」のDIEへの参照になってます。

なお、DW_AT_specificationを持っているメンバ関数本体側のDIEには、クラス宣言DIEの子DIEであるメンバ関数のDIEを見れば分かるAttributeは、省かれています。(ムダなので)
特に、「メンバ関数名」「戻り値型」は通常、(クラス宣言DIE側を見れば分かるので)もっていません。


クラステンプレート

C++のクラステンプレートは、「DW_TAG_class_type」「DW_TAG_structure_type」「DW_TAG_union_type」など、通常のクラス/構造体/unionと同じTAGで表現されます。
が、以下4つ「例外」があり、それゆえ(テンプレートとして)使われ得る型や変数分、同じAttributeや、子DIEとして同じ型が含まれてしまうことがあるのです。[[BR]

※よーするに、どうやらテンプレート自体をDWARFで表現することはできない代わりに、ソース上で結果としてテンプレートとして適用した型や変数の分、重複して情報を持たせる仕組みみたいです。

ということで、以下例外4箇条

  • 例外1) 引数である「パラメタ化された型の宣言」
    • (クラステンプレートの)引数である、パラメタ化された型は、「DW_TAG_template_type_parameter」なTAGを持つDIEとなり、クラステンプレートのDIE自体の子DIEとなります。
    • 「DW_TAG_type_parameter」をTAGとするDIEは、以下のAttributeをもっています
      • DW_AT_name:
        • ソース上の、クラステンプレートの引数である「パラメタ化された型」の名称(NULLおわりもじれつ)
      • DW_AT_type
        • 実際にクラステンプレートが使用され、「型」が展開されたあとの「実際の型」への参照
  • 例外2) 引数である「パラメタ化された変数の宣言」
    • (クラステンプレートの)引数である、パラメタ化された変数は、「DW_TAG_template_value_parameter」なTAGを持つDIEとなり、クラステンプレートのDIE自体の子DIEとなるです。
    • 以下のAttributeを持っています。
      • DW_AT_name
        • ソース上での、クラステンプレートの引数となっている「パラメタ化された変数の名前」 (NULLケツの文字列)
      • DW_AT_type
        • ソース上での、パラメタ化された変数の「型」
      • DW_AT_const_value
        • マシン上での、このインスタンスでの変数の値(定数) ?これなんだろね。よくわかっていず?
  • 例外3) コンパイラがクラステンプレートを持っとくために特別なCompilation Unitをつくっちゃった場合
    • 特別なCompilation Unitを作ってしまい、さらに、クラステンプレートを含むCompilation Unitの名前を別名に変えてしまった時
    • この、コンパイラがクラステンプレート保持のために、特別にこしらえた別名のCompilation Unit名、すなわち、その勝手に作成CUのDW_AT_nameなAttributeは、残念ながら削除されます。
      • まぁ、デバッガ上にこれを表示されても、ユーザーは「はぁ?」ってことにしかならずムダなので、当然。
  • 例外4) クラス型のDIEがテンプレートの展開後、もしくはクラス型の子DIEが宣言と対等のAttributeを含む場合
    • それらのDIEのAttribute(内での参照先は)、クラステンプレート定義を参照するようになります。
      • コンパイラが勝手に作ったソースの方はみません
    • この例外4は直訳です。何いってるんだろ。。。


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