aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYifan Lu2016-10-05 23:09:11 -0700
committerYifan Lu2016-10-05 23:09:11 -0700
commit60aee49bc717e68b79e3102497cbb9435623fc7a (patch)
tree35dc88bc502cdb64acbfdf95454d94e0f3733cd7
parentChanged malloc in substitute_hook_functions to alloca (diff)
downloadsubstitute-60aee49bc717e68b79e3102497cbb9435623fc7a.tar.gz
Support using a different VMA for the hook dest
-rw-r--r--lib/hook-functions.c3
-rw-r--r--lib/substitute.h2
2 files changed, 4 insertions, 1 deletions
diff --git a/lib/hook-functions.c b/lib/hook-functions.c
index d7b925f..4fc61e0 100644
--- a/lib/hook-functions.c
+++ b/lib/hook-functions.c
@@ -182,7 +182,8 @@ int substitute_hook_functions(const struct substitute_function_hook *hooks,
#endif
hi->code = code;
hi->arch_dis_ctx = arch;
- uintptr_t pc_patch_start = (uintptr_t) code;
+ uintptr_t pc_patch_start = hook->func_addr ?
+ hook->func_addr : (uintptr_t) code;
int patch_size;
bool need_intro_trampoline;
if ((ret = check_intro_trampoline(&trampoline_ptr, &trampoline_addr,
diff --git a/lib/substitute.h b/lib/substitute.h
index d3af586..9a8d9ba 100644
--- a/lib/substitute.h
+++ b/lib/substitute.h
@@ -98,6 +98,8 @@ struct substitute_function_hook {
/* Currently unused; pass 0. (Protip: When using C {} struct initializer
* syntax, you can just omit this.) */
int options;
+ /* If not zero, then assume the actual address of function is func_addr */
+ uintptr_t func_addr;
};
/* substitute_hook_functions options */