aboutsummaryrefslogtreecommitdiffstats
path: root/linker/linker_phdr.cpp
diff options
context:
space:
mode:
authorBrian Carlstrom <bdc@google.com>2013-05-21 16:49:24 -0700
committerBrian Carlstrom <bdc@google.com>2013-05-21 16:57:55 -0700
commit82dcc7910d9c25c4fdf635d6132fa86ae3677363 (patch)
tree46661acee967aad59083d8c096f14ec1baa1cd2f /linker/linker_phdr.cpp
parent2e317075b044e94fc75e36d08bec8a7eb5fc31ae (diff)
downloadandroid_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.cpp23
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,