diff options
author | Brian Carlstrom <bdc@google.com> | 2013-05-21 16:49:24 -0700 |
---|---|---|
committer | Brian Carlstrom <bdc@google.com> | 2013-05-21 16:57:55 -0700 |
commit | 82dcc7910d9c25c4fdf635d6132fa86ae3677363 (patch) | |
tree | 46661acee967aad59083d8c096f14ec1baa1cd2f /linker/linker_phdr.cpp | |
parent | 2e317075b044e94fc75e36d08bec8a7eb5fc31ae (diff) | |
download | android_bionic-82dcc7910d9c25c4fdf635d6132fa86ae3677363.tar.gz android_bionic-82dcc7910d9c25c4fdf635d6132fa86ae3677363.tar.bz2 android_bionic-82dcc7910d9c25c4fdf635d6132fa86ae3677363.zip |
Fix bionic linker to support segments with zero p_filesz
(cherry picked from commit 96362fb9d11beef6233aa03db396f25688e70860)
Change-Id: Ib075a6dfc45d5d0746d8b278f317dd9b8d772f2a
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, |