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
diff --git a/linker/linker.cpp b/linker/linker.cpp
index edf0329..9301f8c 100644
--- a/linker/linker.cpp
+++ b/linker/linker.cpp
@@ -301,13 +301,14 @@
     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 @@
     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;
   }