From 82dcc7910d9c25c4fdf635d6132fa86ae3677363 Mon Sep 17 00:00:00 2001 From: Brian Carlstrom Date: Tue, 21 May 2013 16:49:24 -0700 Subject: Fix bionic linker to support segments with zero p_filesz (cherry picked from commit 96362fb9d11beef6233aa03db396f25688e70860) Change-Id: Ib075a6dfc45d5d0746d8b278f317dd9b8d772f2a --- linker/linker_phdr.cpp | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) (limited to 'linker/linker_phdr.cpp') 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, -- cgit v1.2.3