.debug_rangeセクションの構造、の前に、まず前提として、これです。
DWARFの.debug_infoセクション内の各レコード(DIE)内では、Compilation Unit(C言語なら、.cソースファイルの単位)とか、モジュールの初期化時、関数、通常のプログラムブロック、(C++の)try/catchブロック、ラベルなどのデバッグ情報の一部として、プログラムコードのアドレスや、アドレスの範囲が指定されることがありますです。
んで、これらの情報は、.debug_info/.debug_abbrev内の属性では、以下のものにそーとーするみたいです。(これ、後の.debug_infoのとこのメモで、イヤというほど出てきそうです。今は、へぇーでいいような)
ということで、.debug_rangeセクションの目的が分かったところで、構造です。
で、上のメモから、このセクションでは、連続しない複数箇所の範囲、を表現するためのもんです。これって言い替えると、開始アドレスと終了アドレスの組、が複数あれば、表現できますすよね。
そして、この構造どっかで見たような。。。どうも、.debug_locと、目的違えど、構造ってほとんど同じっぽいです。
てなわけで、まずデータ格納構造です。以下のデータの組が、ひたすら連続してつまっている、です。
で、例によって、この組で表現されるデータの種類が、以下の3種類があります。
No. | データ構造名 | <開始オフセット> | <終了オフセット> | 簡単なせつめい |
1 | Range List Entry (RLE) | プログラムコードアドレス範囲の 開始アドレスオフセット マシンのビットサイズ | プログラムコードアドレス範囲の 終了アドレスオフセット マシンのビットサイズ | プログラムコードアドレスの範囲の1つ、を示すレコードです |
2 | Base Address Selection Entry (BASE) | 0xffffffffffffffff (64bit) 0xffffffff (32bit) | ベースアドレス マシンのビットサイズ | RLEのオフセットのベースとなるアドレス、を指定するレコード |
3 | End of List Entry (ELE) | 0x00 マシンのビットサイズ | 0x00 マシンのビットサイズ | 対象としていた"Non-contiguous Address Ranges"の終了を示すレコード |
なので、例えば、"Non-contiguous Address Ranges"で表現する対象のプログラムコードアドレスが2つあり(AとBとする)、それぞれ3つずつのアドレス範囲から構成されていて、Bはベースアドレスの設定が必要、と言うケースでは、
みたいない、データ構造になる、ってことです。
RLEでの<開始オフセット>、<終了オフセット>は、文字づらの通り、「オフセット」です。つまりどっかのアドレスからの、相対アドレスってことです。
では、どっから?ってなりますね。これ、以下のルールで決まります。
また、<終了オフセット> ≧ <開始オフセット> が成立します。(つーか、しないと訳分かんなくなるんで、とーぜんですけどね)
ほな、いきまひょか〜としたいのですが。。。これも、どーやっても、実機でこのセクションをつくり出せてないです。(.debug_pubtypesとおんなじ)
ので、スミマセンが、今回は実機解析できまへぇんーーーー。
まぁ、ただ幸い、構造が簡単なことと、.debug_locと似通っていてそっち見れば分かる、というのがあるんで、割愛です。
[PageInfo]
LastUpdate: 2013-06-04 22:28:29, ModifiedBy: koinec
[License]
FreeBSD Documentation License
[Permissions]
view:all, edit:members, delete/config:members