Browse Source

elf_mem_map: expand member arrays

Yuri D'Elia 2 years ago
parent
commit
776b82a6db
1 changed files with 34 additions and 3 deletions
  1. 34 3
      tools/elf_mem_map

+ 34 - 3
tools/elf_mem_map

@@ -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