Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1f34c0e7 authored by Christopher Ferris's avatar Christopher Ferris
Browse files

Fix handling of globals for new linker.

The new linker base map is read-only, but the global handling code
for jit and dex information assumed the base map was a read-execute
one. Relax that requirement to search read-only maps.

Adjust the unit tests for this case.

Bug: 117293117
Test: Passes unit tests.
Test: Passes art cfi tests with and without llvm linker.
Change-Id: I31a765d51847d0b8d778ace9cbaa29f42073f4d9
parent 380d3192
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -126,7 +126,7 @@ void DexFiles::Init(Maps* maps) {

  const std::string dex_debug_name("__dex_debug_descriptor");
  for (MapInfo* info : *maps) {
    if (!(info->flags & PROT_EXEC) || !(info->flags & PROT_READ) || info->offset != 0) {
    if (!(info->flags & PROT_READ) || info->offset != 0) {
      continue;
    }

+4 −5
Original line number Diff line number Diff line
@@ -174,7 +174,7 @@ void JitDebug::Init(Maps* maps) {

  const std::string descriptor_name("__jit_debug_descriptor");
  for (MapInfo* info : *maps) {
    if (!(info->flags & PROT_EXEC) || !(info->flags & PROT_READ) || info->offset != 0) {
    if (!(info->flags & PROT_READ) || info->offset != 0) {
      continue;
    }

@@ -194,10 +194,9 @@ void JitDebug::Init(Maps* maps) {

    Elf* elf = info->GetElf(memory_, true);
    uint64_t descriptor_addr;
    if (elf->GetGlobalVariable(descriptor_name, &descriptor_addr)) {
      // Search for the first non-zero entry.
      descriptor_addr += info->start;
      entry_addr_ = (this->*read_descriptor_func_)(descriptor_addr);
    // Find first non-empty entry (libart might be loaded multiple times).
    if (elf->GetGlobalVariable(descriptor_name, &descriptor_addr) && descriptor_addr != 0) {
      entry_addr_ = (this->*read_descriptor_func_)(descriptor_addr + info->start);
      if (entry_addr_ != 0) {
        break;
      }
+7 −7
Original line number Diff line number Diff line
@@ -46,17 +46,17 @@ class DexFilesTest : public ::testing::Test {
    maps_.reset(
        new BufferMaps("1000-4000 ---s 00000000 00:00 0\n"
                       "4000-6000 r--s 00000000 00:00 0\n"
                       "6000-8000 -w-s 00000000 00:00 0\n"
                       "a000-c000 r-xp 00000000 00:00 0\n"
                       "c000-f000 rwxp 00000000 00:00 0\n"
                       "f000-11000 r-xp 00000000 00:00 0\n"
                       "6000-8000 -wxs 00000000 00:00 0\n"
                       "a000-c000 r--p 00000000 00:00 0\n"
                       "c000-f000 rw-p 00000000 00:00 0\n"
                       "f000-11000 r--p 00000000 00:00 0\n"
                       "100000-110000 rw-p 0000000 00:00 0\n"
                       "200000-210000 rw-p 0000000 00:00 0\n"
                       "300000-400000 rw-p 0000000 00:00 0\n"));
    ASSERT_TRUE(maps_->Parse());

    // Global variable in a section that is not readable/executable.
    MapInfo* map_info = maps_->Get(kMapGlobalNonReadableExectable);
    // Global variable in a section that is not readable.
    MapInfo* map_info = maps_->Get(kMapGlobalNonReadable);
    ASSERT_TRUE(map_info != nullptr);
    MemoryFake* memory = new MemoryFake;
    ElfFake* elf = new ElfFake(memory);
@@ -95,7 +95,7 @@ class DexFilesTest : public ::testing::Test {
  void WriteEntry64(uint64_t entry_addr, uint64_t next, uint64_t prev, uint64_t dex_file);
  void WriteDex(uint64_t dex_file);

  static constexpr size_t kMapGlobalNonReadableExectable = 3;
  static constexpr size_t kMapGlobalNonReadable = 2;
  static constexpr size_t kMapGlobalSetToZero = 4;
  static constexpr size_t kMapGlobal = 5;
  static constexpr size_t kMapDexFileEntries = 7;
+4 −4
Original line number Diff line number Diff line
@@ -45,11 +45,11 @@ class JitDebugTest : public ::testing::Test {
    maps_.reset(
        new BufferMaps("1000-4000 ---s 00000000 00:00 0\n"
                       "4000-6000 r--s 00000000 00:00 0\n"
                       "6000-8000 -w-s 00000000 00:00 0\n"
                       "6000-8000 -wxs 00000000 00:00 0\n"
                       "a000-c000 --xp 00000000 00:00 0\n"
                       "c000-f000 rwxp 00000000 00:00 0\n"
                       "f000-11000 r-xp 00000000 00:00 0\n"
                       "12000-14000 r-xp 00000000 00:00 0\n"
                       "c000-f000 rw-p 00000000 00:00 0\n"
                       "f000-11000 r--p 00000000 00:00 0\n"
                       "12000-14000 r--p 00000000 00:00 0\n"
                       "100000-110000 rw-p 0000000 00:00 0\n"
                       "200000-210000 rw-p 0000000 00:00 0\n"));
    ASSERT_TRUE(maps_->Parse());