1、用python elftool解析结构体的时候,成员偏移量存在DW_AT_data_member_location字段解析;此字段是可变长的(uleb128编码); 第一个字节是操作码 后续是偏移量
uleb128编码,正如其名,是小端结尾的。因此第一个字节代表的是整形值的最低7比特位的值,第二个字节代表整型值的次低7比特位的值,以此类推,最后一个字节(最高位为0)代表整形值的最高7比特位的值。所以,代码中每发现要多用一个字节,都要多向左移动7位。
如下是2字节长度数据例子:
2、dwarf 数据例子以及理解:
dwarf:
<2><1274c>: Abbrev Number: 8 (DW_TAG_member)
<1274d> DW_AT_decl_file : 1
<1274e> DW_AT_decl_line : 13
<1274f> DW_AT_name : recStamp
<12753> DW_AT_type : <0x12650>
<12757> DW_AT_data_member_location: 2 byte block: 23 0 (DW_OP_plus_uconst: 0)
<2><1275a>: Abbrev Number: 8 (DW_TAG_member)
<1275b> DW_AT_decl_file : 1
<1275c> DW_AT_decl_line : 13
<1275d> DW_AT_name : frameSize
<12769> DW_AT_type : <0x12650>
<1276d> DW_AT_data_member_location: 2 byte block: 23 4 (DW_OP_plus_uconst: 4)
...
<127fe> DW_AT_data_member_location: 3 byte block: 23 9c 1 (DW_OP_plus_uconst: 156)
...
<12a4f> DW_AT_data_member_location: 3 byte block: 23 80 2 (DW_OP_plus_uconst: 256)
理解:
<12757> DW_AT_data_member_location: 2 byte block: 23 0 (DW_OP_plus_uconst: 0)
2个字节:
操作码: 字节1 (0x23)
偏移: 0
<127fe> DW_AT_data_member_location: 3 byte block: 23 9c 1 (DW_OP_plus_uconst: 156)
3个字节:
操作码:字节1 (0x23)
偏移: 字节2 & 0x7F | (字节3 & 0x7F)* 128
28 + 1*128 = 156
<12a4f> DW_AT_data_member_location: 3 byte block: 23 80 2 (DW_OP_plus_uconst: 256)
3个字节:
操作码:字节1 (0x23)
偏移: 字节2 & 0x7F | (字节3 & 0x7F)* 128
0 + 2*128 = 256