info->brk was erroneously set to the end of highest addressed
writable segment which could result it in overlapping the executable.
As per load_elf_binary in fs/binfmt_elf.c in Linux, it should be
set to end of highest addressed segment.
Signed-off-by: Timothy E Baldwin <T.E.Baldwin99@members.leeds.ac.uk>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Message-Id: <
20200728224615.326675-1-T.E.Baldwin99@members.leeds.ac.uk>
Signed-off-by: Laurent Vivier <laurent@vivier.eu>
if (vaddr_ef > info->end_data) {
info->end_data = vaddr_ef;
}
- if (vaddr_em > info->brk) {
- info->brk = vaddr_em;
- }
+ }
+ if (vaddr_em > info->brk) {
+ info->brk = vaddr_em;
}
} else if (eppnt->p_type == PT_INTERP && pinterp_name) {
char *interp_name;
if (info->end_data == 0) {
info->start_data = info->end_code;
info->end_data = info->end_code;
- info->brk = info->end_code;
}
if (qemu_log_enabled()) {