summaryrefslogtreecommitdiffstats
path: root/linker
diff options
context:
space:
mode:
authorDavid Srbecky <dsrbecky@google.com>2015-06-19 18:25:56 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2015-06-19 18:26:21 +0000
commitc08c88b5fcec05551858c32bc57f4ae614c0ce5c (patch)
treef24412b002373cc46c0ab95ae14a24335adab412 /linker
parent7d6410e9579168ae4a77f6b6e3e96a7df3df380a (diff)
parent34e8e47d321b129920c5142a81c2db88128c1595 (diff)
downloadbionic-c08c88b5fcec05551858c32bc57f4ae614c0ce5c.zip
bionic-c08c88b5fcec05551858c32bc57f4ae614c0ce5c.tar.gz
bionic-c08c88b5fcec05551858c32bc57f4ae614c0ce5c.tar.bz2
Merge "Add flag that makes linker honor min(p_vaddr)" into mnc-dev
Diffstat (limited to 'linker')
-rw-r--r--linker/linker_phdr.cpp8
1 files changed, 7 insertions, 1 deletions
diff --git a/linker/linker_phdr.cpp b/linker/linker_phdr.cpp
index 638c9d6..f586b08 100644
--- a/linker/linker_phdr.cpp
+++ b/linker/linker_phdr.cpp
@@ -316,6 +316,8 @@ bool ElfReader::ReserveAddressSpace(const android_dlextinfo* extinfo) {
void* start;
size_t reserved_size = 0;
bool reserved_hint = true;
+ // Assume position independent executable by default.
+ uint8_t* mmap_hint = nullptr;
if (extinfo != nullptr) {
if (extinfo->flags & ANDROID_DLEXT_RESERVED_ADDRESS) {
@@ -324,6 +326,10 @@ bool ElfReader::ReserveAddressSpace(const android_dlextinfo* extinfo) {
} else if (extinfo->flags & ANDROID_DLEXT_RESERVED_ADDRESS_HINT) {
reserved_size = extinfo->reserved_size;
}
+
+ if ((extinfo->flags & ANDROID_DLEXT_FORCE_FIXED_VADDR) != 0) {
+ mmap_hint = addr;
+ }
}
if (load_size_ > reserved_size) {
@@ -333,7 +339,7 @@ bool ElfReader::ReserveAddressSpace(const android_dlextinfo* extinfo) {
return false;
}
int mmap_flags = MAP_PRIVATE | MAP_ANONYMOUS;
- start = mmap(nullptr, load_size_, PROT_NONE, mmap_flags, -1, 0);
+ start = mmap(mmap_hint, load_size_, PROT_NONE, mmap_flags, -1, 0);
if (start == MAP_FAILED) {
DL_ERR("couldn't reserve %zd bytes of address space for \"%s\"", load_size_, name_);
return false;