|
@@ -138,8 +138,39 @@ def get_elf_globals(path, expand_structs, struct_gaps=True):
|
|
|
if member_DIE.tag == 'DW_TAG_member' and 'DW_AT_name' in member_DIE.attributes:
|
|
|
m_name = member_DIE.attributes['DW_AT_name'].value.decode('ascii')
|
|
|
m_off = get_FORM_block1(member_DIE.attributes['DW_AT_data_member_location'])
|
|
|
- m_size = get_type_arrsize(member_DIE)
|
|
|
- members.append(Member(m_name, m_off, m_size))
|
|
|
+ m_byte_size = get_type_size(member_DIE)[1]
|
|
|
+
|
|
|
+ # still expand member arrays
|
|
|
+ m_array_dim = []
|
|
|
+ m_array_DIE = get_type_def(member_DIE, 'DW_TAG_array_type')
|
|
|
+ if m_array_DIE is not None:
|
|
|
+ for range_DIE in m_array_DIE.iter_children():
|
|
|
+ if range_DIE.tag == 'DW_TAG_subrange_type' and \
|
|
|
+ 'DW_AT_upper_bound' in range_DIE.attributes:
|
|
|
+ m_array_dim.append(range_DIE.attributes['DW_AT_upper_bound'].value + 1)
|
|
|
+
|
|
|
+ if len(m_array_dim) == 0 or (len(m_array_dim) == 1 and m_array_dim[0] == 1):
|
|
|
+ # plain entry
|
|
|
+ members.append(Member(m_name, m_off, m_byte_size))
|
|
|
+ elif len(m_array_dim) == 1 and m_byte_size == 1:
|
|
|
+ # likely string, avoid expansion
|
|
|
+ members.append(Member(m_name + '[]', m_off, m_array_dim[0]))
|
|
|
+ else:
|
|
|
+ # expand array entries
|
|
|
+ m_array_pos = m_off
|
|
|
+ m_array_loc = [0] * len(m_array_dim)
|
|
|
+ while True:
|
|
|
+ # location index
|
|
|
+ sfx = ''
|
|
|
+ for d in range(len(m_array_dim)):
|
|
|
+ sfx += '[{}]'.format(m_array_loc[d])
|
|
|
+
|
|
|
+ members.append(Member(m_name + sfx, m_array_pos, m_byte_size))
|
|
|
+
|
|
|
+ # advance
|
|
|
+ if array_inc(m_array_loc, m_array_dim):
|
|
|
+ break
|
|
|
+ m_array_pos += m_byte_size
|
|
|
|
|
|
if struct_gaps and len(members):
|
|
|
# fill gaps in the middle
|
|
@@ -187,9 +218,9 @@ def get_elf_globals(path, expand_structs, struct_gaps=True):
|
|
|
expand_members(Entry(name + sfx, array_pos, byte_size), members)
|
|
|
|
|
|
# advance
|
|
|
- array_pos += byte_size
|
|
|
if array_inc(array_loc, array_dim):
|
|
|
break
|
|
|
+ array_pos += byte_size
|
|
|
|
|
|
return grefs
|
|
|
|