50 lines
1.1 KiB
Python
Executable File
50 lines
1.1 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
|
|
import struct, sys
|
|
|
|
import hackyelf
|
|
|
|
if len(sys.argv) == 1:
|
|
printf("Usage: %s <input.elf> > <output.cfg>" % 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)
|