elf_mem_map: allow to annotate overlapping regions for clarity

This commit is contained in:
Yuri D'Elia 2021-06-05 17:06:36 +02:00 committed by DRracer
parent 1d82d2da64
commit a5635997b2

View File

@ -233,7 +233,7 @@ def decode_dump(path):
return (buf_addr, buf_data)
def annotate_refs(grefs, addr, data, width=45, gaps=True):
def annotate_refs(grefs, addr, data, width=45, gaps=True, overlaps=True):
last_end = None
for entry in grefs:
if entry.loc < addr:
@ -254,12 +254,16 @@ def annotate_refs(grefs, addr, data, width=45, gaps=True):
typ = 'f' if len(buf) == 4 else 'd'
buf_repr += ' F:' + '{:10.3f}'.format(unpack(typ, buf)[0])
if gaps and last_end is not None and last_end < pos:
# decode gaps
gap_size = pos - last_end
gap_buf = data[last_end:pos]
print('{:04x} {} {:4} R:{}'.format(addr+last_end, "*UNKNOWN*".ljust(width),
gap_size, gap_buf.hex()))
if last_end is not None:
if gaps and last_end < pos:
# decode gaps
gap_size = pos - last_end
gap_buf = data[last_end:pos]
print('{:04x} {} {:4} R:{}'.format(addr+last_end, "*UNKNOWN*".ljust(width),
gap_size, gap_buf.hex()))
if overlaps and last_end > pos + 1:
gap_size = pos - last_end
print('{:04x} {} {:4}'.format(addr+last_end, "*OVERLAP*".ljust(width), gap_size))
print('{:04x} {} {:4}{} R:{}'.format(entry.loc, entry.name.ljust(width),
entry.size, buf_repr, buf.hex()))
@ -284,6 +288,8 @@ def main():
help='do not dump memory inbetween known symbols')
ap.add_argument('--no-expand-structs', action='store_true',
help='do not decode structure data')
ap.add_argument('--overlaps', action='store_true',
help='annotate overlaps greater than 1 byte')
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')
@ -295,7 +301,9 @@ def main():
print_map(grefs)
else:
addr, data = decode_dump(args.dump)
annotate_refs(grefs, addr, data, gaps=not args.no_gaps)
annotate_refs(grefs, addr, data,
gaps=not args.no_gaps,
overlaps=args.overlaps)
if __name__ == '__main__':
exit(main())