ということで、まずデータ構造を表でざっくり。
No. | データ名 | サイズ | 形式 | 説明 |
1 | length | 4 Byte | int | 以下、No.2-xの部分のデータサイズ(Byte)です |
2 | CIE_id | 8 Byte(64bit) | unsigned long | CIEかFDEかのデータの区別。0xffffffffffffffff ならCIE。それ以外はFDE |
3 | version | 1 Byte | unsigned char | .debug_frame情報のバージョン。DWARFのバージョンとは違うものです。 |
4 | augmentation | ?(0x00までのデータずっと) | BinaryData (UTF-8文字列) | コンパイラ拡張による (通常無視OK?) |
5 | code_alignment_factor | uLEB128のサイズ | uLEB128 | CFIルール表の行での命令アドレスのバウンダリサイズ。これが例えば4なら、CFIの各行の命令アドレスも4の倍数になる |
6 | data_alignment_factor | sLEB128のサイズ | sLEB128 | 先のCIE/FDEの命令にあった offset(N), val_offset(N)を計算する際の、データアドレスのバウンダリ値。この後の命令説明で出て来ます |
7 | return_address_register | uLEB128のサイズ | uLEB128 | CFIルール表内のregisterのうち、関数の戻りアドレスを示すレジスタの番号 |
8 | initial_instructions | No.1 length - (No.2-7,9の総和サイズ) | (後述) | CFIルール表の「列の定義」と「最初の行のデータ設定」 以下参照 |
9 | padding | No.1 length - (No.2-8の総和サイズ) | 0x00 | 単なるパディング |
このデータ部分で、CFIルール表の「列の定義」と「最初の行のデータ設定」が指定されます。
具体的には、CFIルール表の2列目の「CFA」、および3列目以降のreg xそれぞれに対する初期指定の命令が、CFA 1つ+使う(表に定義する)レジスタ数分繰り返されています。
例えば、(DWARF V3 App.D.6. Fig.6.3 より)
みたいな感じです。
この「DW_CFA_なんちゃら」は、命令です。これの説明は後述。
[PageInfo]
LastUpdate: 2013-05-28 22:10:27, ModifiedBy: koinec
[License]
FreeBSD Documentation License
[Permissions]
view:all, edit:members, delete/config:members