1、用python elftool解析结构体的成员计算偏移的时候,会用到如下结构体;
2、data member location 是可变长的(uleb128编码);DW_OP_plus_uconst是操作码;
uleb128编码,正如其名,是小端结尾的。因此第一个字节代表的是整形值的最低7比特位的值,第二个字节代表整型值的次低7比特位的值,以此类推,最后一个字节(最高位为0)代表整形值的最高7比特位的值。所以,代码中每发现要多用一个字节,都要多向左移动7位。
如:
3、如下是一个例子:
<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)
比如:
2 byte block: 23 0 (DW_OP_plus_uconst: 0)
两个字节:长度是 0
3 byte block: 23 9c 1 (DW_OP_plus_uconst: 156)
三个字节:
操作码:字节1
偏移:字节2 & 0x7F | (字节3 & 0x7F)* 128
28 + 1*128 = 156
3 byte block: 23 80 2 (DW_OP_plus_uconst: 256)
三个字节:长度是 0x280
偏移:字节2 & 0x7F | (字节3 & 0x7F)* 128
0 + 2*128 = 256