diff options
author | Giuseppe Musacchio <thatlemon@gmail.com> | 2019-05-03 14:20:07 +0200 |
---|---|---|
committer | Laurent Vivier <laurent@vivier.eu> | 2019-05-10 12:44:22 +0200 |
commit | d87146bce08d3d2ea6c00025d7ee0bfa77991692 (patch) | |
tree | 3a7f137303b017ec581ca54e0ccaeca636614d8f /linux-user | |
parent | 43330b7169ae76222472a4b20c7f4db9d8880527 (diff) | |
download | qemu-d87146bce08d3d2ea6c00025d7ee0bfa77991692.zip qemu-d87146bce08d3d2ea6c00025d7ee0bfa77991692.tar.gz qemu-d87146bce08d3d2ea6c00025d7ee0bfa77991692.tar.bz2 |
linux-user: elf: Map empty PT_LOAD segments
Some PT_LOAD segments may be completely zeroed out and their p_filesize
is zero, in that case the loader should just allocate a page that's at
least p_memsz bytes large (plus eventual alignment padding).
Calling zero_bss does this job for us, all we have to do is make sure we
don't try to mmap a zero-length page.
Signed-off-by: Giuseppe Musacchio <thatlemon@gmail.com>
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Message-Id: <20190503122007.lkjsvztgt4ycovac@debian>
Signed-off-by: Laurent Vivier <laurent@vivier.eu>
Diffstat (limited to 'linux-user')
-rw-r--r-- | linux-user/elfload.c | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/linux-user/elfload.c b/linux-user/elfload.c index d08fe23..ef42e02 100644 --- a/linux-user/elfload.c +++ b/linux-user/elfload.c @@ -2366,11 +2366,19 @@ static void load_elf_image(const char *image_name, int image_fd, vaddr_ps = TARGET_ELF_PAGESTART(vaddr); vaddr_len = TARGET_ELF_PAGELENGTH(eppnt->p_filesz + vaddr_po); - error = target_mmap(vaddr_ps, vaddr_len, - elf_prot, MAP_PRIVATE | MAP_FIXED, - image_fd, eppnt->p_offset - vaddr_po); - if (error == -1) { - goto exit_perror; + /* + * Some segments may be completely empty without any backing file + * segment, in that case just let zero_bss allocate an empty buffer + * for it. + */ + if (eppnt->p_filesz != 0) { + error = target_mmap(vaddr_ps, vaddr_len, elf_prot, + MAP_PRIVATE | MAP_FIXED, + image_fd, eppnt->p_offset - vaddr_po); + + if (error == -1) { + goto exit_perror; + } } vaddr_ef = vaddr + eppnt->p_filesz; |