Fix run-test after introduction of VDEX
Run-test 119-noimage-patchoat used to fail due to a codepath in
OatFile which allows to create an instance of the class from an
existing ElfFile instance. This patch updates the codepath to require
an existing VdexFile as well.
Test: art/test/run-test 119
Bug: 30937355
Change-Id: I8fd0e47f07921aaee999f73711766ada9c35d214
diff --git a/runtime/runtime.cc b/runtime/runtime.cc
index ba12d33..d8e8573 100644
--- a/runtime/runtime.cc
+++ b/runtime/runtime.cc
@@ -829,6 +829,8 @@
// We are falling back to non-executable use of the oat file because patching failed, presumably
// due to lack of space.
+ std::string vdex_filename =
+ ImageHeader::GetVdexLocationFromImageLocation(system_filename.c_str());
std::string oat_filename =
ImageHeader::GetOatLocationFromImageLocation(system_filename.c_str());
std::string oat_location =
@@ -838,22 +840,34 @@
if (EndsWith(oat_location, ".jar")) {
oat_location.replace(oat_location.length() - 3, 3, "oat");
}
+ std::string error_msg;
+
+ std::unique_ptr<VdexFile> vdex_file(VdexFile::Open(vdex_filename,
+ false /* writable */,
+ false /* low_4gb */,
+ &error_msg));
+ if (vdex_file.get() == nullptr) {
+ return false;
+ }
std::unique_ptr<File> file(OS::OpenFileForReading(oat_filename.c_str()));
if (file.get() == nullptr) {
return false;
}
- std::string error_msg;
std::unique_ptr<ElfFile> elf_file(ElfFile::Open(file.release(),
- false,
- false,
- /*low_4gb*/false,
+ false /* writable */,
+ false /* program_header_only */,
+ false /* low_4gb */,
&error_msg));
if (elf_file.get() == nullptr) {
return false;
}
std::unique_ptr<const OatFile> oat_file(
- OatFile::OpenWithElfFile(elf_file.release(), oat_location, nullptr, &error_msg));
+ OatFile::OpenWithElfFile(elf_file.release(),
+ vdex_file.release(),
+ oat_location,
+ nullptr,
+ &error_msg));
if (oat_file == nullptr) {
LOG(WARNING) << "Unable to use '" << oat_filename << "' because " << error_msg;
return false;