おしながき

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詳細(その08) 基本型、不特定型、型修飾子、typedef編

基本型 (DW_TAG_base_type)

基本型、とは、「プログラミング言語自体が内蔵している型」を指します。つまり、intやdoubleなど、コーディングする時、自分で定義しなくてもいい型、という意味です。
原文の定義では「他の型との関係で定義されないデータ型」となっていますが、これも正しいですね。(つまり、intはshortから定義されているわけではない、ということで)

この基本型は「DW_TAG_base_type」なTAGでその情報が示されます。このTAGは、以下表に示す、いろんな?Atrributeを持つ可能性ありですので、これを示すです。

No. Attribute名 せつめー
1 DW_AT_name このAttributeを持つTAGが所属するCompilation Unit(オブジェクトファイル)の
プログラミング言語上に記載されている基本型の名称(NULL文字おわり)
2 DW_AT_encoding 基本型内での、データの表現方法や意味を示すための定数です。
これは、そーと複雑なので、 「Attribute詳細(その01) エンコード形式、パック10進、固定小数点編」を参照です
3 DW_AT_endianity 基本型のエンディアンを示す定数。
TAG詳細(その06) 変数/関数の引数/定数編」のNo.12の通りでごわす
4 DW_AT_byte_size この基本型(で宣言されたオブジェクト)の表現に必要なバイト数
5 DW_AT_bit_size 対象とする基本型が、(No.4の)DW_AT_byte_sizeで指定されたバイト数の全てを使わない(一部のビットだけなど)場合、このAttribute君が登場します。(以下No.6とセットで)
この場合、このAttributeは「実際に使うビット数」を示すです
※例えば、DW_AT_byte_sizeが1Byte=8bitのデータで、上から3ビット目〜6ビット目の4ビットしか使わない基本型の場合、このDW_AT_bit_size=4です。
6 DW_AT_bit_offset 対象とする基本型が、(No.4の)DW_AT_byte_sizeで指定されたバイト数の全てを使わない(一部のビットだけなど)場合、このAttribute君が登場します。(上記No.5とセットで)
この場合、このAttributeは「実際に使うビットが始まる、最上位ビットからのオフセットビット数」を示すです
※例えば、DW_AT_byte_sizeが1Byte=8bitのデータで、上から3ビット目〜6ビット目の4ビットしか使わない基本型の場合、このDW_AT_bit_offset=3です。
7 DW_AT_start_scope この基本型が有効になるのが、DW_TAG_base_typeのスコープとなるTAG(一般に、親TAG)のDW_AT_low_pcからでなく、途中から始まる場合、有効となる最初のコードアドレスです。
これは「TAG詳細(その06) 変数/関数の引数/定数編」を参照です。


不特定型 (DW_TAG_unspecified_type)

「不特定型」とは、(この訳語がいいかどうかは別にして)、簡単に言うと、C言語での”void”です。
voidは、C言語では「(どの型としてアクセスするかを特定しない)メモリアドレスの型("void *")」として使ったり、typedefした任意の構造体型を受けたりするときに使うと思いますが、こうった用途を指すです。
この「不特定型」は、「DW_TAG_unspecified_type」として定義されます。
Attributeとしては、「DW_AT_name」を持っていることがあり、もっている場合は、ソース上のこの型の名称で、NULL終り文字列の形式となります。


型修飾子

「基本型」や「ユーザによる定義型」などの「型」は、言語毎の方法で、「修飾」されるケースがあるです。(例えば、Cならint型でも、ポインタ*が付いたり、constになったりと)
こーいうのは「型修飾子」という扱いで、DWARF上でも基本型やユーザによる定義型を、修飾するTAGで表現するです。
まず、以下表に、修飾子を並べてみます。

No. TAG名 意味
1 DW_TAG_const_type C/C++での”const”修飾子です。
2 DW_TAG_packed_type (Pascal/Ada) ”packed”修飾型です。
3 DW_TAG_pointer_type 修飾対象とする型を「ポインタ型」にするって意味。
難しいこと抜きにして、C言語の”*”と理解しておーけーです
4 DW_TAG_reference_type C++の「参照渡し」じゃ。
※メソッドの引数に&付けるやつです
5 DW_TAG_restrict_type Cの”restrict”修飾子です。
6 DW_TAG_shared_type UPCの”shared”修飾型
※UPCってなんじゃ?
7 DW_TAG_volatile_type C/C++での”volatile”修飾子です

こうやって表を見ると、この「型修飾子」、CやC++だけなら、ずばり「修飾子」と理解しておーけーです。(但し、ポインタ宣言も、参照渡し宣言も、修飾子となっていることがミソ)

んで、この修飾子、以下のAttributeを持ってることが一般的です。

No. Attribute名 せつめい
1 DW_AT_name (もしソース上で修飾子型に名前を与えられているならば)
ソース上での修飾子型の名前をNULLおわり文字列としてもってます
2 DW_AT_type 修飾対象とする基本型、ユーザ定義型、その他の型修飾子のDIEへの参照です。
これ、以下も参照です
3 DW_AT_address_class この属性は、ポインタやアドレス参照を示す修飾子型の場合、持ってます。
んで、この属性の値は、与えられたポインタやアドレス参照型をもつオブジェクトがどうやってそれを参照すべきかを示すもんです。
★これ、いまいち不明。あとで要調査!★
4 DW_AT_count この修飾子型が、UPCのshared修飾型の場合、もっているAttribute。
んで、これは型のブロックサイズを示す定数を値としてもっていますです。
もし(UPCのshared修飾型なのに)このAttributeがない場合は、ブロックサイズ=無限大、の扱いです

んで、最後に。
C言語では、いうまでもなく、「型のポインタ指定」やら「const」やらを同時に指定(宣言)すること、がふつーです。(というか、const/volatile/restrictは同時指定でなくてはならない。単体では使えない。。。)
例えば、以下のよーなケースですね。

  const unsigned char *p;
この例では、修飾子型に該当するのが「const」「ポインタ"*"」の2つあり、さらに基本型「unsigned char」と3つが乱立しています。
で、最後にいーたかったのは、こいつら複数指定方法と順序ですが、これは簡単で、

(ソース上での)右からの登場順に表現され、次のアイテムへのリンクはDW_AT_typeでの参照とする。
但し、基本型どはソース上どこで定義されようと、一番最後(一番左に登場する)扱いとなるのです

以下、原文からの拝借ですが、2つ例を書きますです。

例1

  const unsigned char * volatile p;
この例では、以下の様にDW_AT_typeを通じて、リンクされます。
  DW_TAG_variable(p)    : まず変数が来ます。そして、これを修飾子、基本型で定義していく形になります。
    → DW_TAG_volatile_type
      → DW_TAG_pointer_type
        → DW_TAG_const_type    : constはunsigned charよりも左にあるのですが、修飾子なので先にきます。
          → DW_TAG_base_type(unsigned char)    : 基本型unsigned charは、Cソース上ではconstよりも右ですが、基本型なので一番最後です

例2
  volatile unsigned char * const restrict p;
こいつは、以下の様になります。
  DW_TAG_variable(p)
    → DW_TAG_restrict_type
      → DW_TAG_const_type
        → DW_TAG_pointer_type
          → DW_TAG_volatile_type
            → DW_TAG_base_type(unsigned char)


typedefによるユーザ型

C言語やC++の”typedef”ですが、これは「DW_TAG_typedef」で表現され、以下のAttributeを持ってるです。

No. Attriute名 せつめい
1 DW_AT_name NULL文字おわりの、ソース上でのtypedefのおなまえ
2 DW_AT_type typedef内で定義した基本型やstruct/unionなどへのリンク
なお、typdefが定義されていない型の宣言であった場合、このDW_AT_typeは含まないことになってます
3 DW_AT_start_scope このtypedefが有効になるのが、DW_TAG_base_typeのスコープとなるTAG(一般に、親TAG)のDW_AT_low_pcからでなく、途中から始まる場合、有効となる最初のコードアドレスです。
これは「TAG詳細(その06) 変数/関数の引数/定数編」を参照です。


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