diff options
| -rw-r--r-- | compiler/elf_writer_test.cc | 51 |
1 files changed, 35 insertions, 16 deletions
diff --git a/compiler/elf_writer_test.cc b/compiler/elf_writer_test.cc index eca67a8a6e..95e5f9f73d 100644 --- a/compiler/elf_writer_test.cc +++ b/compiler/elf_writer_test.cc @@ -29,9 +29,19 @@ class ElfWriterTest : public CommonTest { } }; -#define EXPECT_ELF_FILE_ADDRESS(ef, value, name, build_map) \ - EXPECT_EQ(value, reinterpret_cast<void*>(ef->FindSymbolAddress(::llvm::ELF::SHT_DYNSYM, name, build_map))); \ - EXPECT_EQ(value, ef->FindDynamicSymbolAddress(name)); \ +#define EXPECT_ELF_FILE_ADDRESS(ef, expected_value, symbol_name, build_map) \ + do { \ + void* addr = reinterpret_cast<void*>(ef->FindSymbolAddress(::llvm::ELF::SHT_DYNSYM, \ + symbol_name, \ + build_map)); \ + EXPECT_NE(nullptr, addr); \ + EXPECT_LT(static_cast<uintptr_t>(ART_BASE_ADDRESS), reinterpret_cast<uintptr_t>(addr)); \ + if (expected_value == nullptr) { \ + expected_value = addr; \ + } \ + EXPECT_EQ(expected_value, addr); \ + EXPECT_EQ(expected_value, ef->FindDynamicSymbolAddress(symbol_name)); \ + } while (false) TEST_F(ElfWriterTest, dlsym) { std::string elf_filename; @@ -45,22 +55,31 @@ TEST_F(ElfWriterTest, dlsym) { LOG(INFO) << "elf_filename=" << elf_filename; UnreserveImageSpace(); - void* dl_oat_so = dlopen(elf_filename.c_str(), RTLD_NOW); - ASSERT_TRUE(dl_oat_so != NULL) << dlerror(); - void* dl_oatdata = dlsym(dl_oat_so, "oatdata"); - ASSERT_TRUE(dl_oatdata != NULL); + void* dl_oatdata = NULL; + void* dl_oatexec = NULL; + void* dl_oatlastword = NULL; - OatHeader* dl_oat_header = reinterpret_cast<OatHeader*>(dl_oatdata); - ASSERT_TRUE(dl_oat_header->IsValid()); - void* dl_oatexec = dlsym(dl_oat_so, "oatexec"); - ASSERT_TRUE(dl_oatexec != NULL); - ASSERT_LT(dl_oatdata, dl_oatexec); +#if defined(ART_USE_PORTABLE_COMPILER) + { + // We only use dlopen for loading with portable. See OatFile::Open. + void* dl_oat_so = dlopen(elf_filename.c_str(), RTLD_NOW); + ASSERT_TRUE(dl_oat_so != NULL) << dlerror(); + dl_oatdata = dlsym(dl_oat_so, "oatdata"); + ASSERT_TRUE(dl_oatdata != NULL); + + OatHeader* dl_oat_header = reinterpret_cast<OatHeader*>(dl_oatdata); + ASSERT_TRUE(dl_oat_header->IsValid()); + dl_oatexec = dlsym(dl_oat_so, "oatexec"); + ASSERT_TRUE(dl_oatexec != NULL); + ASSERT_LT(dl_oatdata, dl_oatexec); - void* dl_oatlastword = dlsym(dl_oat_so, "oatlastword"); - ASSERT_TRUE(dl_oatlastword != NULL); - ASSERT_LT(dl_oatexec, dl_oatlastword); + dl_oatlastword = dlsym(dl_oat_so, "oatlastword"); + ASSERT_TRUE(dl_oatlastword != NULL); + ASSERT_LT(dl_oatexec, dl_oatlastword); - ASSERT_EQ(0, dlclose(dl_oat_so)); + ASSERT_EQ(0, dlclose(dl_oat_so)); + } +#endif UniquePtr<File> file(OS::OpenFileForReading(elf_filename.c_str())); ASSERT_TRUE(file.get() != NULL); |