おしながき

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ファイルフォーマット

Attribute詳細(その01) エンコード形式、パック10進、固定小数点編

DW_AT_encodingとそれに関連するAttributeは、比較的にめんどいので、個別のぺーじとして書きますです。


DW_AT_encoding

DW_AT_encodingとは、「データオブジェクト(上の基本型などもとーぜん含むです)内での、データの表現方法」を示すもんです。
これ、まぁコンピュータの中では、2進整数でしか扱われない、とか思いがち?やけど、んなことはなくて、分かりやすい例では、浮動小数点(ビットを3つに区切って、符号、指数、仮数にしてる)とか、アドレス(とはいってもこれはただの2進だが)に加え、COBOLなどではパック10進などがあり、実は多彩です。というこで、まず、以下表にまとめます。

No. encoding名称 value せつめい
1 DW_ATE_address 0x01 メモリアドレス(リニア空間)
2 DW_ATE_boolean 0x02 Boolean型(TrueかFalseのもの)
3 DW_ATE_complex_float 0x03 複素数浮動小数点
※ただし、実際どーやって複素数がバイナリとして表現されるか、しらん
※DWARF3以降
4 DW_ATE_float 0x04 浮動小数点(float/double)
5 DW_ATE_signed 0x05 符号付き2進整数(int、short、longなど)
6 DW_ATE_signed_char 0x06 符号付きキャラクタ(char)
7 DW_ATE_unsigned 0x07 符号なし2進整数(unsigned int、unsinged longなど)
8 DW_ATE_unsigned_char 0x08 符号なしキャラクタ(unsigned char)
9 DW_ATE_imaginary_float 0x09 虚数浮動小数点
※これも、実際どのように表現されるのかまではしらんです
10 DW_ATE_packed_decimal 0x0a パックド10進小数(以下参照)
※DWARF3以降
11 DW_ATE_numeric_string 0x0b 数文字列(以下参照)
※DWARF3以降
12 DW_ATE_edited 0x0c 編集文字列
※DWARF3以降
13 DW_ATE_signed_fixed 0x0d 符号付きスケール固定小数
※DWARF3以降
14 DW_ATE_unsigned_fixed 0x0e 符号なしスケール固定小数
※DWARF3以降
15 DW_ATE_decimal_float 0x0f 10進浮動小数(IEEE754R形式)
※DWARF3以降
16 DW_ATE_lo_user 0x80 (これより大きい値の場合、コンパイラ独自)
※DWARF3以降
17 DW_ATE_hi_user 0xff (コンパイラ独自定義の最大値)
※DWARF3以降


(No.10) DW_ATE_packed_decimal & (No.11) DW_ATE_numeric_string

まず、こいつらはどっちも『数文字列』に属するです。(ただ、ワタクシがこれを良く分かっていません。。。なんか、COBOLとかでは使えたはず。以下その前提で)
んで、それぞれの違いは以下の表の通りです。

Attribute名 パック有無 符号
DW_ATE_packed_decimal あり
DW_ATE_numeric_string × なし

そして、DW_AT_encodingの値がこれら2つのいずれかの場合、DW_AT_encodingを持っているTAGは、「DW_AT_decimal_sign」「DW_AT_digit_count」「DW_AT_decimal_scale」の3つのAttributeを持っていますです。
これら3つのAttributeの説明は、ページに下にそれぞれ書きますんで、こちら参照ってことで。

(No.12) DW_ATE_edited & DW_AT_picture_string

これは、「COBOL言語での編集数値/編集アルファベット型」なencodingであることを示すです。
んで、この値を持つDW_AT_encodingを持っているTAGは「DW_AT_picture_string」なAttributeを持ってます。
DW_AT_picture_stringなAttributeは、ターゲットマシン依存の、この型と関連する「絵文字」(NULL終り)を持ってます。(これ、COBOLは良く分かりませんが、なんとなくPC-98x1にもあった「外字」っぽいですね)

んで、もしこの型が「変数数値」であった場合は、「DW_AT_digit_count」「DW_AT_decimal_scale」の属性も持ってて、解釈は下のこれらの属性欄に記述の通りです。(つまり、上のDW_ATE_packed_decimalやDW_ATE_numeric_stringと同じ)

※なお、「編集アルファベット」の場合は、「DW_AT_digit_count」「DW_AT_decimal_scale」は持ってません。また、仮に「編集数値」で「DW_AT_digit_count」「DW_AT_decimal_scale」もってなかっとしても、実際の「編集数値」の中身から、桁数や倍数を判断しても構わない、との規定者のお達しです。

(No.13) DW_ATE_signed_fixed & (No.14) DW_ATE_unsiged_fixed

これらは、2進固定小数を示します。(それぞれ、符号あり、なし)
2進固定小数ってのも良く分かりませんが、なんとなく、8bitあるうち、例えば下位3bitは小数点以下、見たいな感じでしょうかね
で、こいつらに関連する事項を以下列挙しますです。

  • DW_AT_digit_countなAttributeを持っていて、以下にに書く解釈となるです。(つまり、上のDW_ATE_packed_decimalやDW_ATE_numeric_stringでの解釈と同じ)
  • スケールファクタ(倍数値)は、ベースとする倍数値によって、以下3パターンあります。(それぞれのパターンに沿った、他のAttributeをDW_AT_encodingを持っているTAGが持つことになります)
    • 10の倍数のスケールファクタを持つ場合
      • DW_AT_decimal_scaleを持っていますです。んで、解釈も以下の通り。
    • 2の倍数のスケールファクタを持つ場合
      • 「DW_AT_binary_scale」なAttributeを持つです。この説明は、以下別途。
    • 任意の値の倍数になる場合
      • 「DW_AT_small」なAttributeを持つです。これも、以下別途。


DW_AT_decimal_sign

こいつは、以下の表の値のいずれかで、符号をもつかどうか、もつ場合どういう形式で表現されるか、を示すです。

No. 値の名称 Value いみ
1 DW_DS_unsigned 0x01 符号なし
2 DW_DS_leading_overpunch 0x02 (ターゲットマシンにおいて)もっとも大きい桁に符号を持つ
3 DW_DS_trailing_overpunch 0x03 (ターゲットマシンにおいて)もっとも小さい桁に符号を持つ
4 DW_DS_leading_separate 0x04 符号は’+’’-’のどちらかで、一番大きい桁の左に持つ
5 DW_DS_trailing_separate 0x05 <DW_ATE_numeric_stringの場合>
’+’’-’のどちらかで符号をもち、一番小さい桁の右に持つ
<DW_ATE_packed_decimalの場合>
もっとも小さな桁にマシン依存の値で正負を持つ


DW_AT_digit_count

こいつは簡単で、「数値の桁数」を定数としてもってます


DW_AT_decimal_scale

これは、ひとことでいうと、「小数点の位置=10の冪乗数」です。
まず、前提として「1234」なる数値があった場合、(見えないけど)小数点ってとーぜん4の次にあるわけです。(たぶん、小学3年?でみんなそうならったはず)
この位置を「0」とします。そして、仮に「1234×10=12340.0」になります.(不要だけど,あえて小数点入れてみました)。このときのdecimal_scaleを「1」とするです。
んなら、「1234×1000=1234000.0」は「3」になるです。
この表記の場合は、例えば12340の例でも、そのまま12340とはデータをもたせずに、「1234×10」にして、10倍の部分の冪乗数は「1」と表す訳ですね。

んじゃ、小数点はどーすんの、となるわけですが、はい。無論「マイナス」です。例えば、この値が「-6」なら、「1234÷1000000=0.001234」です。


DW_AT_binary_scale

これは「小数点の位置を2の冪乗単位で持つ場合」です。(上のDW_AT_decimal_scaleの2進数版です)
decimal_scaleでは「10進数の桁」単位でしたが、コイツは「ビット単位の桁」での取扱です。
例えば「10010110」な2進数があったときで、かつこいつの全ての桁が整数とした場合は、「10010110.0」ですから、DW_AT_decimal_scale=0です。
これが仮に「10010110000」なら、DW_AT_decimal_scale=3、「1001.0110」ならDW_AT_decimal_scale=-4です。


DW_AT_small

小数点の位置に対する指数(倍数)を、10とか2とかのキリ番ではなくて、任意の値にしたい場合に使うです。
このAttributeは「DW_TAG_constant」なDIEへの参照になってるです。
そして、参照された「DW_TAG_constant」内の定数が、DW_AT_smallを持っている値にかけ算された値が、最終的な値になる、という具合です。

※が、これいまいち良く分かっていません。。。(パック10進やら2進固定小数やらは、第二種情報処理技術者(昔)とかでは散見されたので、聞いた事位はあるのですが、任意に指数なんて知らん。です。あ、ちなみにAda言語に”small”句があって、これのためにある機構っぽいです。って、まず間違いなくF-22やBoeing777は開発しないので、とりあえずほっとくです。


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