mtk-wifi-fw/tools/ghidra_scripts/GPHistogram.py

37 lines
1.1 KiB
Python

# Headless post-script: collect all GP-relative references (addr, imm).
# Dump as CSV lines "GPREF,<insn_addr>,<imm>" for offline base inference.
#@category Analysis
listing = currentProgram.getListing()
lang = currentProgram.getLanguage()
gp = None
for r in lang.getRegisters():
if r.getName().lower() == 'gp':
gp = r
break
print('gp register: %s' % (gp.getName() if gp else None))
from ghidra.program.model.scalar import Scalar # noqa: E402
it = listing.getInstructions(True)
n = 0
while it.hasNext():
ins = it.next()
uses_gp = False
for i in range(ins.getNumOperands()):
for o in ins.getOpObjects(i):
if o == gp:
uses_gp = True
if not uses_gp:
continue
imm = None
for i in range(ins.getNumOperands()):
for o in ins.getOpObjects(i):
if isinstance(o, Scalar):
imm = o.getSignedValue()
break
if imm is not None:
break
print('GPREF,%s,%s' % (ins.getAddress(), imm if imm is not None else ''))
n += 1
print('total gp-refs: %d' % n)