1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- # Copyright 2021 Dolphin Emulator Project
- # Licensed under GPLv2+
- # Refer to the license.txt file included.
- #@category Dolphin
- 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 ghidra_main():
- from ghidra.program.model.symbol import SourceType
- from ghidra.program.model.symbol import SymbolUtilities
- f = askFile("Load a Dolphin emulator symbol map", "Load")
- symbol_map = load_dolphin_map(f.getPath())
- for symbol in symbol_map:
- addr = toAddr(int(symbol.vaddr, 16))
- size = int(symbol.size, 16)
- name = SymbolUtilities.replaceInvalidChars(symbol.name, True)
- if symbol.section in [".init", ".text"]:
- createFunction(addr, symbol.name);
- success = getFunctionAt(addr) is not None
- if not success:
- print("Can't apply properties for symbol:"
- " {0.vaddr} - {0.name}\n".format(symbol))
- createLabel(addr, name, True)
- else:
- getFunctionAt(addr).setName(name, SourceType.USER_DEFINED)
- else:
- createLabel(addr, name, True)
- if __name__ == "__main__":
- ghidra_main()
|