おしながき

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詳細(その09) 配列編 ※array_type、subrange_type、enumeration_type

配列 (DW_TAG_array_type)

ということで、配列です。配列は「DW_TAG_array_type」で表現されます。
こいつも、相応のAttributeを持っていてですね、以下となりますです。

No. Attribute名 意味
1 DW_AT_name (もしソース上で配列に名前を授けられている場合)NULL終りの配列名
2 DW_AT_ordering (多次元配列のDIEの場合)
配列要素の並び順を示す値を持ちます。以下参照
3 DW_AT_type 配列の要素それぞれの型(のDIEへの参照)
4 DW_AT_bit_stride
(DW_AT_stride_size)
配列の各要素のサイズが、その各要素の型が単体で存在した場合のサイズと異なる場合もつAttributeで、
配列のそれぞれの要素のビットサイズ(ビット幅)を持ってます。
※DWARF2では、DW_AT_stride_sizeとしてこの内容の値を持っているですが、DWARF3ではDW_AT_bit_strideに変わったらしいです。
(DWARF3でも)DW_AT_stride_sizeはDW_AT_bit_strideの別名として使われるけど、推奨はしないそーです。
5 DW_AT_byte_size 配列型の総和のサイズをByte単位で持ってます。
※なお、コンパイル時に固定的に配列サイズを決定できるようなケースでは、配列の要素のサイズと要素数のかけ算でもサイズを求めることができます、
って注釈あるけど、ま、これはあたりまーえね。
6 DW_AT_allocated ★後日作成★
7 DW_AT_associated ★後日書くよ★
8 DW_AT_data_location ★後日きっと書くってば★
9 DW_AT_start_scope この基本型が有効になるのが、DW_TAG_base_typeのスコープとなるTAG(一般に、親TAG)のDW_AT_low_pcからでなく、途中から始まる場合、有効となる最初のコードアドレスです。
これは「TAG詳細(その06) 変数/関数の引数/定数編」を参照です。

なお、配列の次元は、「DW_TAG_subrange_type」「DW_TAG_enumeration_type」で示されます。
こいつらのTAGは、配列のDIE(DW_TAG_array_type)の子分DIEとなり、んで、ソース上の次元の表示通りの順番で並べられるです。
(つまり、一番左に現れる次元(多分配列表記での[閉じカッコ!]の左から1つめ、という意味)が最初で、左から2番目の次元が次で。。。の順)

※注釈: ”複数次元配列”という概念のない、C言語などでは、以下の様な配列の配列が複数次元配列として扱われますです。
  int array[5][10];


(No.2) DW_AT_orderingの値

このAttributeは、多次元配列においての、各次元の順番を示すモンです。
この値は、以下の表の2つのうちのどっちかになります。

名称 Value 意味
DW_ORD_col_major 0x00 列優先(つまり、一般に右の要素から順。C言語の標準はこれですね)
DW_ORD_row_major 0x01 行優先(つまり、左の要素から。C言語の標準とは逆の並び)

なお、多次元配列なのにこのAttributeが存在しなかったら、そのCompilation Unit(オブジェクトファイル)のTAG内のDW_AT_languageで指定されるプログラミング言語の「標準的な並び」と仮定されることになってます。
また、一次元配列なのにこのAttributeが存在してしまったら、そいつは単なるおまけです。無視してOK(と原文にも明記しているんです)


enum(列挙)型

(2013/09/17時点) 一旦ここに書きますが、気が向いたら別ページに移してしまうかもです。
ということで、タイトルの如く、「enum」型です。 enum型として宣言した変数自体は「DW_TAG_enumeration_type」として表現されます。で、以下はこいつが持ち得るAttributeです。

No. Attribute名 せつめい
1 DW_AT_name (ソース上でenum型に名前が与えられている場合)
ソース上のenum型の名前をNULL終り文字列で持ってます。
2 DW_AT_byte_size このenum型の値を保持するのに必要なByteサイズを整数で持ってまーす
3 DW_AT_type enum型を(実際のマシン上で)実装するために使われている、(元となっている)型への参照です。
これは、ご存知の方多数なはず?ですが、enum型って、C言語では通常int型とかで実装されています(裏は)
こーいったケースにおいて、この値はint型への参照となるわけですね
※注: C言語やC++では、この「元になる型」は必須になってます(と、原文記述あり)
4 DW_AT_byte_stride
(DW_AT_stride)
(enum型せつめいの最後の部分を参照)
5 DW_AT_bit_stride (enum型せつめいの最後の部分を参照)


で、enum型ですが、これだけでは、終らないはずですね。enum型は、それぞれの値自体に「名前」を持ってます。(それに数値も振ることができるけどね)
この、enum型内での各要素ですが、これは「DW_TAG_enumerator」なTAGで表現され、それぞれのenumeratorなTAG、つまりenumの要素は、「DW_TAG_enumeration_type」なTAGの子供DIEとなるよーになってます。
そして、この子供の順番ですが、これもソース上での宣言の順番と同じになっています。(ま、そーしないと順番わからんくなるですが)
では、「DW_TAG_enumerator」なTAGのAttributeです。

No. Attribute名 せつめい
1 DW_AT_name ソース上のenum型の要素の名称(NULL終り文字列)
2 DW_AT_const_value マシン上で使われるenum型の要素の実際の値

最後に。。。
enum型が配列の次元として宣言されていて(使われていて)、さらにその跨ぎ幅が(通常とは)異なった方法で決められている場合、DW_TAG_enumeration_typeなTAGは「DW_AT_byte_stride」「DW_AT_bit_stride」のいずれかを持ってることがあるです。
こいつらは、(配列の)次元として記述された「連続する要素間の分離場所を特定するため」に使われるもんで、ビット単位で分離箇所を示す必要がある場合は後者、バイト単位で分離箇所を示す必要がある場合は前者、が使われます。

※とってもそのままな「直訳」ですみません。なんか、分かるよーな分からんよーなです。

なお、DW_AT_byte_strideは、DWARF2では「DW_AT_stride」です。DWARF3では、DW_AT_strideはDW_AT_byte_strideの別名として利用可ですが、推奨はされてないみたいです


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