#!/usr/bin/env python3 import struct, sys import hackyelf if len(sys.argv) == 1: printf("Usage: %s > " % sys.argv[0], file=sys.stderr) sys.exit(1) elfblob = None with open(sys.argv[1], 'rb') as f: elfblob = f.read() elf = hackyelf.parse(elfblob) print(""" # TODO: reset halt maybe? halt """) endian = '<' if elf.ident[5] == 1 else '>' for phdr in elf.phdrs: lenbytes = min(phdr.filesz, phdr.memsz) zerobytes = phdr.memsz - lenbytes baseaddr = phdr.paddr if phdr.paddr else phdr.vaddr # text/data lenm4 = lenbytes - (lenbytes & 3) data = struct.unpack('%c%dI' % (endian, lenm4>>2), elfblob[phdr.off:(phdr.off+lenm4)]) for i in range(0, lenbytes, 4): print("mww 0x%08x 0x%08x" % ((baseaddr + i), data[i>>2])) if lenm4 != lenbytes: for i in range(lenm4, lenbytes): print("mwb 0x%08x 0x%02x" % ((baseaddr + i), elfblob[phdr.off + i])) # bss if zerobytes: print("mwb 0x%08x 0x00 0x%08x" % ((baseaddr + lenbytes), zerobytes)) print(""" # set pc to entrypoint reg pc 0x%08x """ % elf.entry)