#!/usr/bin/env python from collections import namedtuple import re import sys import struct DATA = 0 DATA = 1 class Section(object): DATA = 0 CODE = 1 STYP_NOLOAD = 0x0002 STYP_TEXT = 0x0020 STYP_DATA = 0x0040 STYP_BSS = 0x0080 def __init__(self, name, type, start, size, data=None): self.name = name self.type = type self.start = start self.size = size self.data = data @property def flags(self): if self.type == Section.DATA: return Section.STYP_DATA if self.data else Section.STYP_BSS else: return Section.STYP_TEXT if self.data else Section.STYP_NOLOAD class CalypsoCOFF(object): F_RELFLG = 0x0001 # Relocation information stripped from the file F_EXEC = 0x0002 # File is executable (i.e., no unresolved external references) F_LNNO = 0x0004 # Line numbers stripped from the file F_LSYMS = 0x0010 # Local symbols stripped from the file F_LITTLE = 0x0100 # Little endian def __init__(self, data_seg_base=0x80000000): self.sections = {} self.data_seg_base = data_seg_base self.ver_magic = 0x00c1 self.tgt_magic = 0x0098 self.flags = \ CalypsoCOFF.F_RELFLG | \ CalypsoCOFF.F_EXEC | \ CalypsoCOFF.F_LNNO | \ CalypsoCOFF.F_LSYMS | \ CalypsoCOFF.F_LITTLE def _data_pack(self, d): return ''.join(struct.pack(' dump name dump_mapping = { # '.regs' : 'Registers', '.drom' : 'DROM', '.pdrom' : 'PDROM', '.prom0' : 'PROM0', '.prom1' : 'PROM1', '.prom2' : 'PROM2', '.prom3' : 'PROM3', } # Load the dump dump_sections = dict([(s[0], s) for s in dump_load(dump_filename)]) # Create the COFF coff = CalypsoCOFF() # Add each section (with data if we have some) for name, type, start, size in sections: # Dumped data ? d_data = None if (name in dump_mapping) and (dump_mapping[name] in dump_sections): d_name, d_sa, d_ea, d_data = dump_sections[dump_mapping[name]] # Add sections coff.add_section(name, type, start, size, d_data) # Save result coff.save(out_filename) return 0 if __name__ == '__main__': sys.exit(main(*sys.argv))