LoadDolphinMap.py 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. # Copyright 2021 Dolphin Emulator Project
  2. # Licensed under GPLv2+
  3. # Refer to the LICENSES/GPL-2.0-or-later.txt file included.
  4. from collections import namedtuple
  5. DolphinSymbol = namedtuple("DolphinSymbol", [
  6. "section", "addr", "size", "vaddr", "align", "name"
  7. ])
  8. def load_dolphin_map(filepath):
  9. with open(filepath, "r") as f:
  10. section = ""
  11. symbol_map = []
  12. for line in f.readlines():
  13. t = line.strip().split(" ", 4)
  14. if len(t) == 3 and t[1] == "section" and t[2] == "layout":
  15. section = t[0]
  16. continue
  17. if not section or len(t) != 5:
  18. continue
  19. symbol_map.append(DolphinSymbol(section, *t))
  20. return symbol_map
  21. def ida_main():
  22. import idc
  23. filepath = ida_kernwin.ask_file(0, "*.map", "Load a Dolphin emulator symbol map")
  24. if filepath is None:
  25. return
  26. symbol_map = load_dolphin_map(filepath)
  27. for symbol in symbol_map:
  28. addr = int(symbol.vaddr, 16)
  29. size = int(symbol.size, 16)
  30. ida_bytes.del_items(addr, size, 0)
  31. if symbol.section in [".init", ".text"]:
  32. idc.create_insn(addr)
  33. success = ida_funcs.add_func(
  34. addr,
  35. idc.BADADDR if not size else (addr+size)
  36. )
  37. else:
  38. success = ida_bytes.create_data(addr, idc.FF_BYTE, size, 0)
  39. if not success:
  40. ida_kernwin.msg("Can't apply properties for symbol:"
  41. " {0.vaddr} - {0.name}\n".format(symbol))
  42. flags = idc.SN_NOCHECK | idc.SN_PUBLIC
  43. if symbol.name.startswith("zz_"):
  44. flags |= idc.SN_AUTO | idc.SN_WEAK
  45. else:
  46. flags |= idc.SN_NON_AUTO
  47. idc.set_name(addr, symbol.name, flags)
  48. if __name__ == "__main__":
  49. ida_main()