-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathImportDolphinSymbols.py
64 lines (53 loc) · 1.51 KB
/
ImportDolphinSymbols.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#Import .map file from Dolphin generated symbols
#@author Rena
#@category GameCube/Wii
#@keybinding
#@menupath
#@toolbar
AF = currentProgram.getAddressFactory()
listing = currentProgram.getListing()
def addrToInt(addr):
return int(str(addr), 16)
def intToAddr(addr):
return AF.getAddress("0x%08X" % addr)
def setName(fn, name, aObj):
if fn.name == name: return
if(fn.name.startswith("FUN_")
or fn.name.startswith("doNothing_")):
fn.setName(name, ghidra.program.model.symbol.SourceType.IMPORTED)
else:
createLabel(aObj, fn.name, False)
fn.setName(name, ghidra.program.model.symbol.SourceType.IMPORTED)
#print("Not changing name of %s to %s" % (fn.name, name))
def handleSym(addr, sym):
aObj = intToAddr(addr)
fn = listing.getFunctionAt(aObj)
if fn is None:
#print("making function at", addr)
listing.clearCodeUnits(aObj, aObj.add(4), False)
createFunction(aObj, sym['name'])
else: setName(fn, sym['name'], aObj)
def parseLine(line, syms):
addr, size, vAddr, align, name = line.strip().split(' ')
if not name.startswith("zz_"):
addr = int(addr, 16)
size = int(size, 16)
vAddr = int(vAddr, 16)
align = int(align, 16)
syms[addr] = {
'name':name,
'size':size,
'vAddr':vAddr,
'align':align,
}
def parseMapFile(inFile):
syms = {}
for line in inFile:
try: parseLine(line, syms)
except ValueError: pass
return syms
path = str(askFile("Import Symbol Map", "Import"))
with open(path, "rt") as file:
syms = parseMapFile(file)
for addr, sym in syms.items():
handleSym(addr, sym)