mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2024-11-15 05:47:56 -07:00
61 lines
1.7 KiB
Python
61 lines
1.7 KiB
Python
|
# Copyright 2018 Dolphin Emulator Project
|
||
|
# Licensed under GPLv2+
|
||
|
# Refer to the license.txt file included.
|
||
|
|
||
|
from collections import namedtuple
|
||
|
|
||
|
|
||
|
DolphinSymbol = namedtuple("DolphinSymbol", [
|
||
|
"section", "addr", "size", "vaddr", "align", "name"
|
||
|
])
|
||
|
|
||
|
|
||
|
def load_dolphin_map(filepath):
|
||
|
with open(filepath, "r") as f:
|
||
|
section = ""
|
||
|
symbol_map = []
|
||
|
for line in f.readlines():
|
||
|
t = line.strip().split(" ", 4)
|
||
|
if len(t) == 3 and t[1] == "section" and t[2] == "layout":
|
||
|
section = t[0]
|
||
|
continue
|
||
|
if not section or len(t) != 5:
|
||
|
continue
|
||
|
symbol_map.append(DolphinSymbol(section, *t))
|
||
|
return symbol_map
|
||
|
|
||
|
|
||
|
def ida_main():
|
||
|
import idc
|
||
|
|
||
|
filepath = idc.AskFile(0, "*.map", "Load a Dolphin emulator symbol map")
|
||
|
symbol_map = load_dolphin_map(filepath)
|
||
|
|
||
|
for symbol in symbol_map:
|
||
|
addr = int(symbol.vaddr, 16)
|
||
|
size = int(symbol.size, 16)
|
||
|
idc.MakeUnknown(addr, size, 0)
|
||
|
if symbol.section in [".init", ".text"]:
|
||
|
idc.MakeCode(addr)
|
||
|
success = idc.MakeFunction(
|
||
|
addr,
|
||
|
idc.BADADDR if not size else (addr+size)
|
||
|
)
|
||
|
else:
|
||
|
success = idc.MakeData(addr, idc.FF_BYTE, size, 0)
|
||
|
|
||
|
if not success:
|
||
|
idc.Message("Can't apply properties for symbol:"
|
||
|
" {0.vaddr} - {0.name}\n".format(symbol))
|
||
|
|
||
|
flags = idc.SN_NOCHECK | idc.SN_PUBLIC
|
||
|
if symbol.name.startswith("zz_"):
|
||
|
flags |= idc.SN_AUTO | idc.SN_WEAK
|
||
|
else:
|
||
|
flags |= idc.SN_NON_AUTO
|
||
|
idc.MakeNameEx(addr, symbol.name, flags)
|
||
|
|
||
|
|
||
|
if __name__ == "__main__":
|
||
|
ida_main()
|