aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-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 */