elf_mem_map: add qdirstat output for space visualization
This commit is contained in:
parent
676b925c5f
commit
54e24036a8
|
|
@ -4,6 +4,7 @@ import elftools.elf.elffile
|
|||
import elftools.dwarf.descriptions
|
||||
from collections import namedtuple
|
||||
from struct import unpack
|
||||
import re
|
||||
|
||||
SRAM_OFFSET = 0x800000
|
||||
EEPROM_OFFSET = 0x810000
|
||||
|
|
@ -336,6 +337,43 @@ def print_map(grefs):
|
|||
print('{:x}\t{}\t{}\t{}'.format(entry.loc, entry.size, entry.name, entry.declpos))
|
||||
|
||||
|
||||
def print_qdirstat(grefs):
|
||||
print('[qdirstat 1.0 cache file]')
|
||||
|
||||
entries = {}
|
||||
for entry in grefs:
|
||||
paths = list(filter(None, re.split(r'[\[\].]', entry.name)))
|
||||
base = entries
|
||||
for i in range(len(paths) - 1):
|
||||
name = paths[i]
|
||||
if name not in base:
|
||||
base[name] = {}
|
||||
base = base[name]
|
||||
name = paths[-1]
|
||||
base[name] = entry.size
|
||||
|
||||
def walker(root, prefix):
|
||||
files = []
|
||||
dirs = []
|
||||
|
||||
for name, entries in root.items():
|
||||
if type(entries) == int:
|
||||
files.append([name, entries])
|
||||
else:
|
||||
dirs.append([name, entries])
|
||||
|
||||
# print files
|
||||
print('D\t{}\t{}\t0x0'.format(prefix, 0))
|
||||
for name, size in files:
|
||||
print('F\t{}\t{}\t0x0'.format(name, size))
|
||||
|
||||
# recurse directories
|
||||
for name, entries in dirs:
|
||||
walker(entries, prefix + '/' + name)
|
||||
|
||||
walker(entries, '/')
|
||||
|
||||
|
||||
def main():
|
||||
ap = argparse.ArgumentParser(description="""
|
||||
Generate a symbol table map starting directly from an ELF
|
||||
|
|
@ -355,12 +393,16 @@ def main():
|
|||
g = ap.add_mutually_exclusive_group(required=True)
|
||||
g.add_argument('dump', nargs='?', help='RAM dump obtained from D2 g-code')
|
||||
g.add_argument('--map', action='store_true', help='dump global memory map')
|
||||
g.add_argument('--qdirstat', action='store_true',
|
||||
help='dump qdirstat-compatible size usage map')
|
||||
args = ap.parse_args()
|
||||
|
||||
grefs = get_elf_globals(args.elf, expand_structs=not args.no_expand_structs)
|
||||
grefs = list(sorted(grefs, key=lambda x: x.loc))
|
||||
if args.dump is None:
|
||||
if args.map:
|
||||
print_map(grefs)
|
||||
elif args.qdirstat:
|
||||
print_qdirstat(grefs)
|
||||
else:
|
||||
addr, data = decode_dump(args.dump)
|
||||
annotate_refs(grefs, addr, data,
|
||||
|
|
|
|||
Loading…
Reference in New Issue