internal bool GetTrampoline(TargetMemoryAccess memory, TargetAddress address,
out TargetAddress trampoline, out bool is_start)
{
if (!has_got || (address < plt_start) || (address > plt_end))
{
is_start = false;
trampoline = TargetAddress.Null;
return(false);
}
Instruction target_insn = Architecture.ReadInstruction(memory, address);
if ((target_insn == null) || !target_insn.HasInstructionSize ||
((target_insn.InstructionType != Instruction.Type.Jump) &&
(target_insn.InstructionType != Instruction.Type.IndirectJump)))
{
is_start = false;
trampoline = TargetAddress.Null;
return(false);
}
TargetAddress call_target = target_insn.GetEffectiveAddress(memory);
if (call_target.IsNull)
{
is_start = false;
trampoline = TargetAddress.Null;
return(false);
}
if (call_target != address + target_insn.InstructionSize)
{
is_start = false;
trampoline = call_target;
return(true);
}
is_start = true;
trampoline = memory.ReadAddress(got_start + 3 * info.TargetAddressSize);
return(true);
}