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"));