mirror of
https://github.com/0O0o0oOoO00/Alas.git
synced 2026-05-22 03:29:28 +08:00
41 lines
1.3 KiB
C++
41 lines
1.3 KiB
C++
|
|
#include "dobby/dobby_internal.h"
|
|
|
|
#include "TrampolineBridge/ClosureTrampolineBridge/ClosureTrampoline.h"
|
|
|
|
#include "InterceptRouting/Routing/InstructionInstrument/InstructionInstrumentRouting.h"
|
|
#include "InterceptRouting/Routing/InstructionInstrument/instrument_routing_handler.h"
|
|
|
|
// create closure trampoline jump to prologue_routing_dispatch with the `entry_` data
|
|
void InstructionInstrumentRouting::BuildRouting() {
|
|
void *handler = (void *)instrument_routing_dispatch;
|
|
#if defined(__APPLE__) && defined(__arm64__)
|
|
handler = pac_strip(handler);
|
|
#endif
|
|
auto closure_trampoline = ClosureTrampoline::CreateClosureTrampoline(entry_, handler);
|
|
this->SetTrampolineTarget((addr_t)closure_trampoline->address);
|
|
DEBUG_LOG("[closure trampoline] closure trampoline: %p, data: %p", closure_trampoline->address, entry_);
|
|
|
|
// generate trampoline buffer, before `GenerateRelocatedCode`
|
|
addr_t from = entry_->patched_addr;
|
|
#if defined(TARGET_ARCH_ARM)
|
|
if (entry_->thumb_mode)
|
|
from += 1;
|
|
#endif
|
|
addr_t to = GetTrampolineTarget();
|
|
GenerateTrampolineBuffer(from, to);
|
|
}
|
|
|
|
void InstructionInstrumentRouting::DispatchRouting() {
|
|
BuildRouting();
|
|
|
|
// generate relocated code which size == trampoline size
|
|
GenerateRelocatedCode();
|
|
}
|
|
|
|
#if 0
|
|
void *InstructionInstrumentRouting::GetTrampolineTarget() {
|
|
return this->prologue_dispatch_bridge;
|
|
}
|
|
#endif
|