Reserve boot image memory in one go.

Load boot image components into the reserved memory.

Test: m test-art-host-gtest
Test: testrunner.py --host
Test: Pixel 2 XL boots.
Test: m test-art-target-gtest
Test: testrunner.py --target --optimizing
Bug: 77856493
Change-Id: I214f947979bc0bbfc6df4312527504e90b88a01d
diff --git a/dex2oat/linker/elf_writer_test.cc b/dex2oat/linker/elf_writer_test.cc
index b2be003..40495f3 100644
--- a/dex2oat/linker/elf_writer_test.cc
+++ b/dex2oat/linker/elf_writer_test.cc
@@ -14,9 +14,12 @@
  * limitations under the License.
  */
 
+#include <sys/mman.h>  // For the PROT_NONE constant.
+
 #include "elf_file.h"
 
 #include "base/file_utils.h"
+#include "base/mem_map.h"
 #include "base/unix_file/fd_file.h"
 #include "base/utils.h"
 #include "common_compiler_test.h"
@@ -65,8 +68,8 @@
   {
     std::string error_msg;
     std::unique_ptr<ElfFile> ef(ElfFile::Open(file.get(),
-                                              false,
-                                              false,
+                                              /* writable */ false,
+                                              /* program_header_only */ false,
                                               /*low_4gb*/false,
                                               &error_msg));
     CHECK(ef.get() != nullptr) << error_msg;
@@ -77,9 +80,9 @@
   {
     std::string error_msg;
     std::unique_ptr<ElfFile> ef(ElfFile::Open(file.get(),
-                                              false,
-                                              false,
-                                              /*low_4gb*/false,
+                                              /* writable */ false,
+                                              /* program_header_only */ false,
+                                              /* low_4gb */ false,
                                               &error_msg));
     CHECK(ef.get() != nullptr) << error_msg;
     EXPECT_ELF_FILE_ADDRESS(ef, dl_oatdata, "oatdata", true);
@@ -87,16 +90,28 @@
     EXPECT_ELF_FILE_ADDRESS(ef, dl_oatlastword, "oatlastword", true);
   }
   {
-    uint8_t* base = reinterpret_cast<uint8_t*>(ART_BASE_ADDRESS);
     std::string error_msg;
     std::unique_ptr<ElfFile> ef(ElfFile::Open(file.get(),
-                                              false,
-                                              true,
-                                              /*low_4gb*/false,
-                                              &error_msg,
-                                              base));
+                                              /* writable */ false,
+                                              /* program_header_only */ true,
+                                              /* low_4gb */ false,
+                                              &error_msg));
     CHECK(ef.get() != nullptr) << error_msg;
-    CHECK(ef->Load(file.get(), false, /*low_4gb*/false, &error_msg)) << error_msg;
+    size_t size;
+    bool success = ef->GetLoadedSize(&size, &error_msg);
+    CHECK(success) << error_msg;
+    MemMap reservation = MemMap::MapAnonymous("ElfWriterTest#dlsym reservation",
+                                              /* addr */ nullptr,
+                                              RoundUp(size, kPageSize),
+                                              PROT_NONE,
+                                              /* low_4gb */ true,
+                                              &error_msg);
+    CHECK(reservation.IsValid()) << error_msg;
+    uint8_t* base = reservation.Begin();
+    success =
+        ef->Load(file.get(), /* executable */ false, /* low_4gb */ false, &reservation, &error_msg);
+    CHECK(success) << error_msg;
+    CHECK(!reservation.IsValid());
     EXPECT_EQ(reinterpret_cast<uintptr_t>(dl_oatdata) + reinterpret_cast<uintptr_t>(base),
         reinterpret_cast<uintptr_t>(ef->FindDynamicSymbolAddress("oatdata")));
     EXPECT_EQ(reinterpret_cast<uintptr_t>(dl_oatexec) + reinterpret_cast<uintptr_t>(base),
@@ -116,9 +131,9 @@
   {
     std::string error_msg;
     std::unique_ptr<ElfFile> ef(ElfFile::Open(file.get(),
-                                              false,
-                                              false,
-                                              /*low_4gb*/false,
+                                              /* writable */ false,
+                                              /* program_header_only */ false,
+                                              /* low_4gb */ false,
                                               &error_msg));
     CHECK(ef.get() != nullptr) << error_msg;
     EXPECT_TRUE(ef->HasSection(".note.gnu.build-id"));