diff --git a/bsd-user/elfload.c b/bsd-user/elfload.c index 7cccf3eb..195875af 100644 --- a/bsd-user/elfload.c +++ b/bsd-user/elfload.c @@ -15,6 +15,8 @@ #undef ELF_ARCH #endif +extern abi_ulong afl_entry_point, afl_start_code, afl_end_code; + /* from personality.h */ /* @@ -1522,6 +1524,8 @@ int load_elf_binary(struct linux_binprm * bprm, struct target_pt_regs * regs, info->start_data = start_data; info->end_data = end_data; info->start_stack = bprm->p; + if (!afl_start_code) afl_start_code = vaddr; + if (!afl_end_code) afl_end_code = vaddr_ef; /* Calling set_brk effectively mmaps the pages that we need for the bss and break sections */ @@ -1549,6 +1553,20 @@ int load_elf_binary(struct linux_binprm * bprm, struct target_pt_regs * regs, } info->entry = elf_entry; + if (!afl_entry_point) { + char *ptr; + if ((ptr = getenv("AFL_ENTRYPOINT")) != NULL) { + afl_entry_point = strtoul(ptr, NULL, 16); + } else { + afl_entry_point = info->entry; + } +#ifdef TARGET_ARM + /* The least significant bit indicates Thumb mode. */ + afl_entry_point = afl_entry_point & ~(target_ulong)1; +#endif + } + if (getenv("AFL_DEBUG") != NULL) + fprintf(stderr, "AFL forkserver entrypoint: %p\n", (void*)afl_entry_point); return 0; }