おしながき

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詳細(その11) オブジェクト指向言語編1 (Interface、Friend、継承/拡張/インタフェース実装体)

※注:このページの内容、最終的にどこにまとめるべきなのか、決め兼ねてます。(とりあえず、仮でその11)

インタフェース(JAVA)

  • JAVAには、「抽象化されたメソッドや定数、データメンバだけのクラス」とも取れるよーな、”インタフェース(タイプ)”が定義されています。
  • こいつは「DW_TAG_interface_type」で表現され、以下のAttributeとか子DIEとかをもってます。
    • DW_AT_nameなAttributeには、NULL終り文字列で、ソース上のインタフェース名を持ってるです。
    • このインタフェースのメンバは、DW_TAG_interface_typeなDIEの子DIEになっていて、ソース上での登場順と同じ順番になっています。


Friend宣言(C++/JAVA)

  • C++とかJAVAには「Friend」宣言で、クラスのオブジェクトやメソッドを特別に?参照可能にするもんがあるはずです。
  • このFriend宣言は、宣言しているクラス(やunion、構造体)のDIE(通常DW_TAG_class_type)の、子DIEとして表現されます。
  • この子DIEは、「DW_TAG_friend」のTAGになっています。
    • このDIEのAttributeには「DW_AT_friend」があって、こいつの値は「仲良しになったクラスなどのDIEへの参照」です。


クラスやインタフェースの継承や拡張

まず、原文直訳ですが。。。

  • C++では、クラスの「継承」や、他のクラスの「サブクラス」という概念があります
  • JAVAでは、1つもしくはそれ以上のインタフェースの「拡張」という概念があります
    • (この考え方ゆえ)他のクラスを「拡張」したクラスや、1つもしくはそれ以上のインタフェースに対する「実装」という概念があります

ということで、これら「継承」「サブクラス」「拡張」「実装」などの概念での、クラスとクラスの関係のDWARFでの表現方法のホンヤクになります。

  • まず、(親/基底)クラスやインタフェースの継承/拡張/実装によって作られた(サブ)クラスやインタフェース実装体は、継承/拡張元のクラスや実装するインタフェースの「子DIE」として表現されますです。
  • これら(サブ)クラスやインタフェースの実装体が複数ある場合は、ソース上の順番通りの登場順になってマス
  • (サブ)クラスやインタフェース実装体のDIEは、「DW_TAG_inheritance」なTAGを持つDIEとなり、以下のAttributeを持っています。
    No. Attribute名 ごせつめい
    1 DW_AT_type この値は継承/拡張元のクラスもしくは実装するインタフェースなど、つまり、「(親/基底)クラス/インタフェース」宣言のDIEへの参照
    2 DW_AT_data_member_location 他のクラスを「継承」もしくは「拡張」したクラスのDIE(つまり、サブクラスのDIE)の場合(インタフェースは含まれないっぽい)
    このAttributeの値は、継承されたクラス(親クラス)のメモリアドレス上での開始位置に関連する、継承された型の開始アドレスで、値の形式次第で、以下2パターンありです。
    * 値が「定数」であれば → クラスの開始アドレスから継承した型の開始アドレスまでのByte単位でのオフセット値
    * それ以外の値の形式の場合 → 「Location description」での表現となり、以下の注意事項がアリです。
    注意1) この「Location description」を表かする前に、継承されたクラス(親クラス)の開始アドレスがDWARF expression スタックのトップにpushされている前提とします
    注意2) この前提の上、「Location description」を評価した結果が、継承された型のメモリアドレス上の開始位置
    ★この開始アドレスの説明は、英文自体の難易はそんなんでもないよーに読めましたが、そおそも「継承された型」がなぜ突然出て来るか不明で、理解できていません。。。
    3 DW_AT_accessibility (Attribute名の通り)アクセス権定義です。
    このAttributeを持っていなかった場合、注意ありです!
    * 対象が「クラス」なら → 「private」が宣言されたもの、と仮定します
    * 対象が「インタフェース」なら → 「public」が宣言されたもの、と仮定します。
    4 DW_AT_virtuality もし継承元のクラスがC++の「基底」クラスならば、virtual句の状況を示します
    なお、蛇足だけど、原文にはこのAttributeを持つケース、つまり「基底クラス」のケースでは、DW_AT_data_member_locationの「Location description」は一般にただならぬ(面倒な)内容になるよ、って脅しも書いてあります。。。


アクセス権宣言

  • C++では、継承されたクラスには、継承の宣言によって決まるアクセス権を上書きする「アクセス権宣言」が含まれることがあります。
    • ”private”とか”public”ですね。
  • 継承されたクラス(や構造体)がアクセス権の宣言を持っている場合、これらの宣言は継承されたクラス(や構造体)自体のDIEの子DIEとして表現され、「DW_TAG_access_declaration」なTAGになるです。
  • DW_TAG_access_declarationがTAGであるDIEは、以下のAttributeを持ているです。
    No. Attribute名 せつめいだってば
    1 DW_AT_name (クラスや構造体の修飾句としてもっている)、ソース上のアクセス権宣言に使われている名称。(NULLエンド文字列)
    2 DW_AT_accessibility アクセス権を示す定数。(以下参照)


DW_AT_accessibilityの詳細

このAttributeは、文字通り「アクセス権」の種類を示す定数です。種類、意味、値は以下表のとーりです。

No. Accessibility Code name Value 内容
1 DW_ACCESS_public 0x01 public宣言です。(誰からでも見えちゃうよ、ってこと)
2 DW_ACCESS_protected 0x02 protect宣言です。
3 DW_ACCESS_private 0x03 private宣言です。(覗いちゃいやぁ〜ん、ってことです)


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