37 lines
1.1 KiB
Python
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)
|