diff options
Diffstat (limited to 'linker/linker_phdr.cpp')
-rw-r--r-- | linker/linker_phdr.cpp | 23 |
1 files changed, 13 insertions, 10 deletions
diff --git a/linker/linker_phdr.cpp b/linker/linker_phdr.cpp index 64dbb70be..d1387f647 100644 --- a/linker/linker_phdr.cpp +++ b/linker/linker_phdr.cpp @@ -320,16 +320,19 @@ bool ElfReader::LoadSegments() { Elf32_Addr file_end = file_start + phdr->p_filesz; Elf32_Addr file_page_start = PAGE_START(file_start); - - void* seg_addr = mmap((void*)seg_page_start, - file_end - file_page_start, - PFLAGS_TO_PROT(phdr->p_flags), - MAP_FIXED|MAP_PRIVATE, - fd_, - file_page_start); - if (seg_addr == MAP_FAILED) { - DL_ERR("couldn't map \"%s\" segment %d: %s", name_, i, strerror(errno)); - return false; + Elf32_Addr file_length = file_end - file_page_start; + + if (file_length != 0) { + void* seg_addr = mmap((void*)seg_page_start, + file_length, + PFLAGS_TO_PROT(phdr->p_flags), + MAP_FIXED|MAP_PRIVATE, + fd_, + file_page_start); + if (seg_addr == MAP_FAILED) { + DL_ERR("couldn't map \"%s\" segment %d: %s", name_, i, strerror(errno)); + return false; + } } // if the segment is writable, and does not end on a page boundary, |