diff options
Diffstat (limited to 'libunwindstack/tests/MapInfoCreateMemoryTest.cpp')
-rw-r--r-- | libunwindstack/tests/MapInfoCreateMemoryTest.cpp | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/libunwindstack/tests/MapInfoCreateMemoryTest.cpp b/libunwindstack/tests/MapInfoCreateMemoryTest.cpp index 943b3c9dc..a66685a26 100644 --- a/libunwindstack/tests/MapInfoCreateMemoryTest.cpp +++ b/libunwindstack/tests/MapInfoCreateMemoryTest.cpp @@ -118,6 +118,7 @@ TEST_F(MapInfoCreateMemoryTest, file_backed_non_zero_offset_full_file) { std::unique_ptr<Memory> memory(info.CreateMemory(process_memory_)); ASSERT_TRUE(memory.get() != nullptr); ASSERT_EQ(0x100U, info.elf_offset); + EXPECT_EQ(0x100U, info.elf_start_offset); // Read the entire file. std::vector<uint8_t> buffer(1024); @@ -129,6 +130,44 @@ TEST_F(MapInfoCreateMemoryTest, file_backed_non_zero_offset_full_file) { } ASSERT_FALSE(memory->ReadFully(1024, buffer.data(), 1)); + + // Now verify the elf start offset is set correctly based on the previous + // info. + MapInfo prev_info(nullptr, 0, 0x100, 0x10, 0, ""); + info.prev_map = &prev_info; + + // No preconditions met, change each one until it should set the elf start + // offset to zero. + info.elf_offset = 0; + info.elf_start_offset = 0; + memory.reset(info.CreateMemory(process_memory_)); + ASSERT_TRUE(memory.get() != nullptr); + ASSERT_EQ(0x100U, info.elf_offset); + EXPECT_EQ(0x100U, info.elf_start_offset); + + prev_info.offset = 0; + info.elf_offset = 0; + info.elf_start_offset = 0; + memory.reset(info.CreateMemory(process_memory_)); + ASSERT_TRUE(memory.get() != nullptr); + ASSERT_EQ(0x100U, info.elf_offset); + EXPECT_EQ(0x100U, info.elf_start_offset); + + prev_info.flags = PROT_READ; + info.elf_offset = 0; + info.elf_start_offset = 0; + memory.reset(info.CreateMemory(process_memory_)); + ASSERT_TRUE(memory.get() != nullptr); + ASSERT_EQ(0x100U, info.elf_offset); + EXPECT_EQ(0x100U, info.elf_start_offset); + + prev_info.name = info.name; + info.elf_offset = 0; + info.elf_start_offset = 0; + memory.reset(info.CreateMemory(process_memory_)); + ASSERT_TRUE(memory.get() != nullptr); + ASSERT_EQ(0x100U, info.elf_offset); + EXPECT_EQ(0U, info.elf_start_offset); } // Verify that if the offset is non-zero and there is an elf at that @@ -139,6 +178,7 @@ TEST_F(MapInfoCreateMemoryTest, file_backed_non_zero_offset_partial_file) { std::unique_ptr<Memory> memory(info.CreateMemory(process_memory_)); ASSERT_TRUE(memory.get() != nullptr); ASSERT_EQ(0U, info.elf_offset); + EXPECT_EQ(0U, info.elf_start_offset); // Read the valid part of the file. std::vector<uint8_t> buffer(0x100); @@ -162,6 +202,7 @@ TEST_F(MapInfoCreateMemoryTest, file_backed_non_zero_offset_partial_file_whole_e std::unique_ptr<Memory> memory(info.CreateMemory(process_memory_)); ASSERT_TRUE(memory.get() != nullptr); ASSERT_EQ(0U, info.elf_offset); + EXPECT_EQ(0U, info.elf_start_offset); // Verify the memory is a valid elf. uint8_t e_ident[SELFMAG + 1]; @@ -178,6 +219,7 @@ TEST_F(MapInfoCreateMemoryTest, file_backed_non_zero_offset_partial_file_whole_e std::unique_ptr<Memory> memory(info.CreateMemory(process_memory_)); ASSERT_TRUE(memory.get() != nullptr); ASSERT_EQ(0U, info.elf_offset); + EXPECT_EQ(0U, info.elf_start_offset); // Verify the memory is a valid elf. uint8_t e_ident[SELFMAG + 1]; @@ -250,6 +292,7 @@ TEST_F(MapInfoCreateMemoryTest, valid_rosegment_zero_offset) { ASSERT_TRUE(mem.get() != nullptr); EXPECT_EQ(0x4000UL, map_info->elf_offset); EXPECT_EQ(0x4000UL, map_info->offset); + EXPECT_EQ(0U, map_info->elf_start_offset); // Verify that reading values from this memory works properly. std::vector<uint8_t> buffer(0x4000); @@ -295,6 +338,7 @@ TEST_F(MapInfoCreateMemoryTest, valid_rosegment_non_zero_offset) { ASSERT_TRUE(mem.get() != nullptr); EXPECT_EQ(0x1000UL, map_info->elf_offset); EXPECT_EQ(0xb000UL, map_info->offset); + EXPECT_EQ(0xa000UL, map_info->elf_start_offset); // Verify that reading values from this memory works properly. std::vector<uint8_t> buffer(0x4000); @@ -333,6 +377,7 @@ TEST_F(MapInfoCreateMemoryTest, rosegment_from_file) { std::vector<uint8_t> buffer(0x100); EXPECT_EQ(0x2000U, map_info->offset); EXPECT_EQ(0U, map_info->elf_offset); + EXPECT_EQ(0U, map_info->elf_start_offset); ASSERT_TRUE(memory->ReadFully(0, buffer.data(), 0x100)); EXPECT_EQ(0xffU, buffer[0]); @@ -346,6 +391,7 @@ TEST_F(MapInfoCreateMemoryTest, rosegment_from_file) { memory.reset(map_info->CreateMemory(process_memory_)); EXPECT_EQ(0x2000U, map_info->offset); EXPECT_EQ(0x1000U, map_info->elf_offset); + EXPECT_EQ(0x1000U, map_info->elf_start_offset); Elf64_Ehdr ehdr_mem; ASSERT_TRUE(memory->ReadFully(0, &ehdr_mem, sizeof(ehdr_mem))); EXPECT_TRUE(memcmp(&ehdr, &ehdr_mem, sizeof(ehdr)) == 0); |