summaryrefslogtreecommitdiff
path: root/linker/linker.cpp
diff options
context:
space:
mode:
authorEvgenii Stepanov <eugenis@google.com>2020-06-08 16:21:35 -0700
committerEvgenii Stepanov <eugenis@google.com>2020-06-17 17:28:28 -0700
commita8cf3fef2aa2201014c35c3487da222ccfedfc1c (patch)
tree476df9275aa1402085207d231162a49867240378 /linker/linker.cpp
parentad4b47c4290d6291e4280707688ce54c9bf9b72c (diff)
Add randomized padding around shared library mappings.
Improve ASLR by increasing the randomly sized gaps between shared library mappings, and keep them mapped PROT_NONE. Bug: 158113540 Test: look at /proc/$$/maps Change-Id: Ie72c84047fb624fe2ac8b7744b2a2d0d255ea974
Diffstat (limited to 'linker/linker.cpp')
-rw-r--r--linker/linker.cpp11
1 files changed, 7 insertions, 4 deletions
diff --git a/linker/linker.cpp b/linker/linker.cpp
index edf0329c9..9301f8cb5 100644
--- a/linker/linker.cpp
+++ b/linker/linker.cpp
@@ -301,13 +301,14 @@ static void soinfo_free(soinfo* si) {
return;
}
- if (si->base != 0 && si->size != 0) {
+ void* start = reinterpret_cast<void*>(si->has_min_version(6) ? si->get_map_start() : si->base);
+ size_t size = si->has_min_version(6) ? si->get_map_size() : si->size;
+ if (start != nullptr && size != 0) {
if (!si->is_mapped_by_caller()) {
- munmap(reinterpret_cast<void*>(si->base), si->size);
+ munmap(start, size);
} else {
// remap the region as PROT_NONE, MAP_ANONYMOUS | MAP_NORESERVE
- mmap(reinterpret_cast<void*>(si->base), si->size, PROT_NONE,
- MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE, -1, 0);
+ mmap(start, size, PROT_NONE, MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE, -1, 0);
}
}
@@ -599,6 +600,8 @@ class LoadTask {
si_->load_bias = elf_reader.load_bias();
si_->phnum = elf_reader.phdr_count();
si_->phdr = elf_reader.loaded_phdr();
+ si_->set_map_start(elf_reader.map_start());
+ si_->set_map_size(elf_reader.map_size());
return true;
}