loader: Ignore zero-sized ELF segments
Some ELF files have program headers that specify segments that are of zero size. Ignore them, rather than trying to create zero-length ROM blobs for them, because the zero-length blob can falsely trigger the overlapping-ROM-blobs check. Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Tested-by: Hua Yanghao <huayanghao@gmail.com> Message-id: 1502116754-18867-3-git-send-email-peter.maydell@linaro.org
This commit is contained in:
parent
bf1733392c
commit
f33e5e6299
|
@ -451,14 +451,24 @@ static int glue(load_elf, SZ)(const char *name, int fd,
|
||||||
*pentry = ehdr.e_entry - ph->p_vaddr + ph->p_paddr;
|
*pentry = ehdr.e_entry - ph->p_vaddr + ph->p_paddr;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (load_rom) {
|
if (mem_size == 0) {
|
||||||
snprintf(label, sizeof(label), "phdr #%d: %s", i, name);
|
/* Some ELF files really do have segments of zero size;
|
||||||
|
* just ignore them rather than trying to create empty
|
||||||
/* rom_add_elf_program() seize the ownership of 'data' */
|
* ROM blobs, because the zero-length blob can falsely
|
||||||
rom_add_elf_program(label, data, file_size, mem_size, addr, as);
|
* trigger the overlapping-ROM-blobs check.
|
||||||
} else {
|
*/
|
||||||
cpu_physical_memory_write(addr, data, file_size);
|
|
||||||
g_free(data);
|
g_free(data);
|
||||||
|
} else {
|
||||||
|
if (load_rom) {
|
||||||
|
snprintf(label, sizeof(label), "phdr #%d: %s", i, name);
|
||||||
|
|
||||||
|
/* rom_add_elf_program() seize the ownership of 'data' */
|
||||||
|
rom_add_elf_program(label, data, file_size, mem_size,
|
||||||
|
addr, as);
|
||||||
|
} else {
|
||||||
|
cpu_physical_memory_write(addr, data, file_size);
|
||||||
|
g_free(data);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
total_size += mem_size;
|
total_size += mem_size;
|
||||||
|
|
Loading…
Reference in New Issue