xref: /aosp_15_r20/system/unwinding/libunwindstack/tests/ElfCacheTest.cpp (revision eb293b8f56ee8303637c5595cfcdeef8039e85c6)
1 /*
2  * Copyright (C) 2018 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include <elf.h>
18 #include <sys/mman.h>
19 #include <unistd.h>
20 
21 #include <memory>
22 
23 #include <android-base/file.h>
24 
25 #include <gtest/gtest.h>
26 
27 #include <unwindstack/Elf.h>
28 #include <unwindstack/MapInfo.h>
29 #include <unwindstack/Maps.h>
30 
31 #include "ElfFake.h"
32 #include "ElfTestUtils.h"
33 #include "utils/MemoryFake.h"
34 
35 #include <inttypes.h>
36 
37 namespace unwindstack {
38 
39 class ElfCacheTest : public ::testing::Test {
40  protected:
SetUpTestSuite()41   static void SetUpTestSuite() { memory_.reset(new MemoryFake); }
42 
SetUp()43   void SetUp() override {
44     Elf::SetCachingEnabled(true);
45 
46     // Create maps for testing.
47     maps_.reset(
48         new BufferMaps("1000-2000 r-xs 00000000 00:00 0 elf_one.so\n"
49                        "2000-3000 r-xs 00000000 00:00 0 elf_two.so\n"
50                        "3000-4000 ---s 00000000 00:00 0\n"
51                        "4000-5000 r--s 00000000 00:00 0 elf_three.so\n"
52                        "5000-6000 r-xs 00001000 00:00 0 elf_three.so\n"
53                        "6000-7000 ---s 00000000 00:00 0\n"
54                        "7000-8000 r--s 00001000 00:00 0 app_one.apk\n"
55                        "8000-9000 r-xs 00005000 00:00 0 app_one.apk\n"
56                        "9000-a000 r--s 00004000 00:00 0 app_two.apk\n"
57                        "a000-b000 r-xs 00005000 00:00 0 app_two.apk\n"
58                        "b000-c000 r--s 00008000 00:00 0 app_two.apk\n"
59                        "c000-d000 r-xs 00009000 00:00 0 app_two.apk\n"
60                        "d000-e000 ---s 00000000 00:00 0\n"
61                        "e000-f000 r-xs 00000000 00:00 0 invalid\n"
62                        "f000-10000 r-xs 00000000 00:00 0 invalid\n"
63                        "10000-11000 r-xs 00000000 00:00 0 elf_two.so\n"
64                        "11000-12000 r-xs 00000000 00:00 0 elf_one.so\n"
65                        "12000-13000 r--s 00000000 00:00 0 elf_three.so\n"
66                        "13000-14000 r-xs 00001000 00:00 0 elf_three.so\n"
67                        "14000-15000 ---s 00000000 00:00 0\n"
68                        "15000-16000 r--s 00001000 00:00 0 app_one.apk\n"
69                        "16000-17000 r-xs 00005000 00:00 0 app_one.apk\n"
70                        "17000-18000 r--s 00004000 00:00 0 app_two.apk\n"
71                        "18000-19000 r-xs 00005000 00:00 0 app_two.apk\n"
72                        "19000-1a000 r--s 00008000 00:00 0 app_two.apk\n"
73                        "1a000-1b000 r-xs 00009000 00:00 0 app_two.apk\n"));
74     ASSERT_TRUE(maps_->Parse());
75 
76     std::unordered_map<std::string, std::string> renames;
77 
78     temps_.emplace_back(new TemporaryFile);
79     renames["elf_one.so"] = temps_.back()->path;
80     WriteElfFile(0, temps_.back().get());
81 
82     temps_.emplace_back(new TemporaryFile);
83     renames["elf_two.so"] = temps_.back()->path;
84     WriteElfFile(0, temps_.back().get());
85 
86     temps_.emplace_back(new TemporaryFile);
87     renames["elf_three.so"] = temps_.back()->path;
88     WriteElfFile(0, temps_.back().get());
89 
90     temps_.emplace_back(new TemporaryFile);
91     renames["app_one.apk"] = temps_.back()->path;
92     WriteElfFile(0x1000, temps_.back().get());
93     WriteElfFile(0x5000, temps_.back().get());
94 
95     temps_.emplace_back(new TemporaryFile);
96     renames["app_two.apk"] = temps_.back()->path;
97     WriteElfFile(0x4000, temps_.back().get());
98     WriteElfFile(0x8000, temps_.back().get());
99 
100     for (auto& map_info : *maps_) {
101       if (!map_info->name().empty()) {
102         if (renames.contains(map_info->name())) {
103           // Replace the name with the temporary file name.
104           map_info->name() = renames.at(map_info->name());
105         }
106       }
107     }
108   }
109 
110   // Make sure the cache is cleared between runs.
TearDown()111   void TearDown() override { Elf::SetCachingEnabled(false); }
112 
WriteElfFile(uint64_t offset,TemporaryFile * tf)113   void WriteElfFile(uint64_t offset, TemporaryFile* tf) {
114     Elf32_Ehdr ehdr;
115     TestInitEhdr(&ehdr, ELFCLASS32, EM_ARM);
116     Elf32_Shdr shdr = {};
117     shdr.sh_type = SHT_NULL;
118 
119     ehdr.e_shnum = 1;
120     ehdr.e_shoff = 0x2000;
121     ehdr.e_shentsize = sizeof(shdr);
122 
123     ASSERT_EQ(offset, static_cast<uint64_t>(lseek(tf->fd, offset, SEEK_SET)));
124     ASSERT_TRUE(android::base::WriteFully(tf->fd, &ehdr, sizeof(ehdr)));
125     ASSERT_EQ(offset + 0x2000, static_cast<uint64_t>(lseek(tf->fd, offset + 0x2000, SEEK_SET)));
126     ASSERT_TRUE(android::base::WriteFully(tf->fd, &shdr, sizeof(shdr)));
127   }
128 
129   std::vector<std::unique_ptr<TemporaryFile>> temps_;
130   std::unique_ptr<Maps> maps_;
131   static std::shared_ptr<Memory> memory_;
132 };
133 
134 std::shared_ptr<Memory> ElfCacheTest::memory_;
135 
TEST_F(ElfCacheTest,verify_elf_caching)136 TEST_F(ElfCacheTest, verify_elf_caching) {
137   Elf* elf_one = maps_->Find(0x1000)->GetElf(memory_, ARCH_ARM);
138   ASSERT_TRUE(elf_one->valid());
139   Elf* elf_two = maps_->Find(0x2000)->GetElf(memory_, ARCH_ARM);
140   EXPECT_TRUE(elf_two->valid());
141   Elf* elf_three = maps_->Find(0x4000)->GetElf(memory_, ARCH_ARM);
142   ASSERT_TRUE(elf_three->valid());
143 
144   // Check that the caching is working for elf files.
145   EXPECT_EQ(maps_->Find(0x5000)->GetElf(memory_, ARCH_ARM), elf_three);
146   EXPECT_EQ(0U, maps_->Find(0x5000)->elf_start_offset());
147   EXPECT_EQ(0x1000U, maps_->Find(0x5000)->elf_offset());
148   EXPECT_EQ(0x1000U, maps_->Find(0x5000)->offset());
149 
150   EXPECT_EQ(maps_->Find(0x10000)->GetElf(memory_, ARCH_ARM), elf_two);
151   EXPECT_EQ(0U, maps_->Find(0x10000)->elf_start_offset());
152   EXPECT_EQ(0U, maps_->Find(0x10000)->elf_offset());
153   EXPECT_EQ(0U, maps_->Find(0x10000)->offset());
154 
155   EXPECT_EQ(maps_->Find(0x11000)->GetElf(memory_, ARCH_ARM), elf_one);
156   EXPECT_EQ(0U, maps_->Find(0x11000)->elf_start_offset());
157   EXPECT_EQ(0U, maps_->Find(0x11000)->elf_offset());
158   EXPECT_EQ(0U, maps_->Find(0x11000)->offset());
159 
160   EXPECT_EQ(maps_->Find(0x12000)->GetElf(memory_, ARCH_ARM), elf_three);
161   EXPECT_EQ(0U, maps_->Find(0x12000)->elf_start_offset());
162   EXPECT_EQ(0U, maps_->Find(0x12000)->elf_offset());
163   EXPECT_EQ(0U, maps_->Find(0x12000)->offset());
164 
165   EXPECT_EQ(maps_->Find(0x13000)->GetElf(memory_, ARCH_ARM), elf_three);
166   EXPECT_EQ(0U, maps_->Find(0x13000)->elf_start_offset());
167   EXPECT_EQ(0x1000U, maps_->Find(0x13000)->elf_offset());
168   EXPECT_EQ(0x1000U, maps_->Find(0x13000)->offset());
169 }
170 
TEST_F(ElfCacheTest,verify_elf_caching_ro_first_ro_second)171 TEST_F(ElfCacheTest, verify_elf_caching_ro_first_ro_second) {
172   Elf* elf_three = maps_->Find(0x4000)->GetElf(memory_, ARCH_ARM);
173   ASSERT_TRUE(elf_three->valid());
174 
175   EXPECT_EQ(maps_->Find(0x12000)->GetElf(memory_, ARCH_ARM), elf_three);
176   EXPECT_EQ(0U, maps_->Find(0x12000)->elf_start_offset());
177   EXPECT_EQ(0U, maps_->Find(0x12000)->elf_offset());
178   EXPECT_EQ(0U, maps_->Find(0x12000)->offset());
179 }
180 
TEST_F(ElfCacheTest,verify_elf_caching_ro_first_rx_second)181 TEST_F(ElfCacheTest, verify_elf_caching_ro_first_rx_second) {
182   Elf* elf_three = maps_->Find(0x4000)->GetElf(memory_, ARCH_ARM);
183   ASSERT_TRUE(elf_three->valid());
184 
185   EXPECT_EQ(maps_->Find(0x13000)->GetElf(memory_, ARCH_ARM), elf_three);
186   EXPECT_EQ(0U, maps_->Find(0x13000)->elf_start_offset());
187   EXPECT_EQ(0x1000U, maps_->Find(0x13000)->elf_offset());
188   EXPECT_EQ(0x1000U, maps_->Find(0x13000)->offset());
189 }
190 
TEST_F(ElfCacheTest,verify_elf_caching_rx_first_ro_second)191 TEST_F(ElfCacheTest, verify_elf_caching_rx_first_ro_second) {
192   Elf* elf_three = maps_->Find(0x5000)->GetElf(memory_, ARCH_ARM);
193   ASSERT_TRUE(elf_three->valid());
194 
195   EXPECT_EQ(maps_->Find(0x12000)->GetElf(memory_, ARCH_ARM), elf_three);
196   EXPECT_EQ(0U, maps_->Find(0x12000)->elf_start_offset());
197   EXPECT_EQ(0U, maps_->Find(0x12000)->elf_offset());
198   EXPECT_EQ(0U, maps_->Find(0x12000)->offset());
199 }
200 
TEST_F(ElfCacheTest,verify_elf_caching_rx_first_rx_second)201 TEST_F(ElfCacheTest, verify_elf_caching_rx_first_rx_second) {
202   Elf* elf_three = maps_->Find(0x5000)->GetElf(memory_, ARCH_ARM);
203   ASSERT_TRUE(elf_three->valid());
204 
205   EXPECT_EQ(maps_->Find(0x13000)->GetElf(memory_, ARCH_ARM), elf_three);
206   EXPECT_EQ(0U, maps_->Find(0x13000)->elf_start_offset());
207   EXPECT_EQ(0x1000U, maps_->Find(0x13000)->elf_offset());
208   EXPECT_EQ(0x1000U, maps_->Find(0x13000)->offset());
209 }
210 
TEST_F(ElfCacheTest,verify_elf_apk_caching)211 TEST_F(ElfCacheTest, verify_elf_apk_caching) {
212   Elf* app_one_elf1 = maps_->Find(0x7000)->GetElf(memory_, ARCH_ARM);
213   ASSERT_TRUE(app_one_elf1->valid());
214   Elf* app_one_elf2 = maps_->Find(0x8000)->GetElf(memory_, ARCH_ARM);
215   ASSERT_TRUE(app_one_elf2->valid());
216   Elf* app_two_elf1 = maps_->Find(0x9000)->GetElf(memory_, ARCH_ARM);
217   ASSERT_TRUE(app_two_elf1->valid());
218   Elf* app_two_elf2 = maps_->Find(0xb000)->GetElf(memory_, ARCH_ARM);
219   ASSERT_TRUE(app_two_elf2->valid());
220 
221   // Check that the caching is working for elf files in apks.
222   EXPECT_EQ(maps_->Find(0xa000)->GetElf(memory_, ARCH_ARM), app_two_elf1);
223   EXPECT_EQ(0x4000U, maps_->Find(0xa000)->elf_start_offset());
224   EXPECT_EQ(0x1000U, maps_->Find(0xa000)->elf_offset());
225   EXPECT_EQ(0x5000U, maps_->Find(0xa000)->offset());
226 
227   EXPECT_EQ(maps_->Find(0xc000)->GetElf(memory_, ARCH_ARM), app_two_elf2);
228   EXPECT_EQ(0x8000U, maps_->Find(0xc000)->elf_start_offset());
229   EXPECT_EQ(0x1000U, maps_->Find(0xc000)->elf_offset());
230   EXPECT_EQ(0x9000U, maps_->Find(0xc000)->offset());
231 
232   EXPECT_EQ(maps_->Find(0x15000)->GetElf(memory_, ARCH_ARM), app_one_elf1);
233   EXPECT_EQ(0x1000U, maps_->Find(0x15000)->elf_start_offset());
234   EXPECT_EQ(0U, maps_->Find(0x15000)->elf_offset());
235   EXPECT_EQ(0x1000U, maps_->Find(0x15000)->offset());
236 
237   EXPECT_EQ(maps_->Find(0x16000)->GetElf(memory_, ARCH_ARM), app_one_elf2);
238   EXPECT_EQ(0x1000U, maps_->Find(0x16000)->elf_start_offset());
239   EXPECT_EQ(0x4000U, maps_->Find(0x16000)->elf_offset());
240   EXPECT_EQ(0x5000U, maps_->Find(0x16000)->offset());
241 
242   EXPECT_EQ(maps_->Find(0x17000)->GetElf(memory_, ARCH_ARM), app_two_elf1);
243   EXPECT_EQ(0x4000U, maps_->Find(0x17000)->elf_start_offset());
244   EXPECT_EQ(0U, maps_->Find(0x17000)->elf_offset());
245   EXPECT_EQ(0x4000U, maps_->Find(0x17000)->offset());
246 
247   EXPECT_EQ(maps_->Find(0x18000)->GetElf(memory_, ARCH_ARM), app_two_elf1);
248   EXPECT_EQ(0x4000U, maps_->Find(0x18000)->elf_start_offset());
249   EXPECT_EQ(0x1000U, maps_->Find(0x18000)->elf_offset());
250   EXPECT_EQ(0x5000U, maps_->Find(0x18000)->offset());
251 
252   EXPECT_EQ(maps_->Find(0x19000)->GetElf(memory_, ARCH_ARM), app_two_elf2);
253   EXPECT_EQ(0x8000U, maps_->Find(0x19000)->elf_start_offset());
254   EXPECT_EQ(0U, maps_->Find(0x19000)->elf_offset());
255   EXPECT_EQ(0x8000U, maps_->Find(0x19000)->offset());
256 
257   EXPECT_EQ(maps_->Find(0x1a000)->GetElf(memory_, ARCH_ARM), app_two_elf2);
258   EXPECT_EQ(0x8000U, maps_->Find(0x1a000)->elf_start_offset());
259   EXPECT_EQ(0x1000U, maps_->Find(0x1a000)->elf_offset());
260   EXPECT_EQ(0x9000U, maps_->Find(0x1a000)->offset());
261 }
262 
TEST_F(ElfCacheTest,verify_elf_apk_caching_ro_first_ro_second)263 TEST_F(ElfCacheTest, verify_elf_apk_caching_ro_first_ro_second) {
264   Elf* app_two_elf1 = maps_->Find(0x9000)->GetElf(memory_, ARCH_ARM);
265   ASSERT_TRUE(app_two_elf1->valid());
266   Elf* app_two_elf2 = maps_->Find(0xb000)->GetElf(memory_, ARCH_ARM);
267   ASSERT_TRUE(app_two_elf2->valid());
268 
269   EXPECT_EQ(maps_->Find(0x17000)->GetElf(memory_, ARCH_ARM), app_two_elf1);
270   EXPECT_EQ(0x4000U, maps_->Find(0x17000)->elf_start_offset());
271   EXPECT_EQ(0U, maps_->Find(0x17000)->elf_offset());
272   EXPECT_EQ(0x4000U, maps_->Find(0x17000)->offset());
273 
274   EXPECT_EQ(maps_->Find(0x19000)->GetElf(memory_, ARCH_ARM), app_two_elf2);
275   EXPECT_EQ(0x8000U, maps_->Find(0x19000)->elf_start_offset());
276   EXPECT_EQ(0U, maps_->Find(0x19000)->elf_offset());
277   EXPECT_EQ(0x8000U, maps_->Find(0x19000)->offset());
278 }
279 
TEST_F(ElfCacheTest,verify_elf_apk_caching_ro_first_rx_second)280 TEST_F(ElfCacheTest, verify_elf_apk_caching_ro_first_rx_second) {
281   Elf* app_two_elf1 = maps_->Find(0x9000)->GetElf(memory_, ARCH_ARM);
282   ASSERT_TRUE(app_two_elf1->valid());
283   Elf* app_two_elf2 = maps_->Find(0xb000)->GetElf(memory_, ARCH_ARM);
284   ASSERT_TRUE(app_two_elf2->valid());
285 
286   EXPECT_EQ(maps_->Find(0x18000)->GetElf(memory_, ARCH_ARM), app_two_elf1);
287   EXPECT_EQ(0x4000U, maps_->Find(0x18000)->elf_start_offset());
288   EXPECT_EQ(0x1000U, maps_->Find(0x18000)->elf_offset());
289   EXPECT_EQ(0x5000U, maps_->Find(0x18000)->offset());
290 
291   EXPECT_EQ(maps_->Find(0x1a000)->GetElf(memory_, ARCH_ARM), app_two_elf2);
292   EXPECT_EQ(0x8000U, maps_->Find(0x1a000)->elf_start_offset());
293   EXPECT_EQ(0x1000U, maps_->Find(0x1a000)->elf_offset());
294   EXPECT_EQ(0x9000U, maps_->Find(0x1a000)->offset());
295 }
296 
TEST_F(ElfCacheTest,verify_elf_apk_caching_rx_first_ro_second)297 TEST_F(ElfCacheTest, verify_elf_apk_caching_rx_first_ro_second) {
298   Elf* app_two_elf1 = maps_->Find(0xa000)->GetElf(memory_, ARCH_ARM);
299   ASSERT_TRUE(app_two_elf1->valid());
300   Elf* app_two_elf2 = maps_->Find(0xc000)->GetElf(memory_, ARCH_ARM);
301   ASSERT_TRUE(app_two_elf2->valid());
302 
303   EXPECT_EQ(maps_->Find(0x17000)->GetElf(memory_, ARCH_ARM), app_two_elf1);
304   EXPECT_EQ(0x4000U, maps_->Find(0x17000)->elf_start_offset());
305   EXPECT_EQ(0U, maps_->Find(0x17000)->elf_offset());
306   EXPECT_EQ(0x4000U, maps_->Find(0x17000)->offset());
307 
308   EXPECT_EQ(maps_->Find(0x19000)->GetElf(memory_, ARCH_ARM), app_two_elf2);
309   EXPECT_EQ(0x8000U, maps_->Find(0x19000)->elf_start_offset());
310   EXPECT_EQ(0U, maps_->Find(0x19000)->elf_offset());
311   EXPECT_EQ(0x8000U, maps_->Find(0x19000)->offset());
312 }
313 
TEST_F(ElfCacheTest,verify_elf_apk_caching_rx_first_rx_second)314 TEST_F(ElfCacheTest, verify_elf_apk_caching_rx_first_rx_second) {
315   Elf* app_two_elf1 = maps_->Find(0x9000)->GetElf(memory_, ARCH_ARM);
316   ASSERT_TRUE(app_two_elf1->valid());
317   Elf* app_two_elf2 = maps_->Find(0xb000)->GetElf(memory_, ARCH_ARM);
318   ASSERT_TRUE(app_two_elf2->valid());
319 
320   EXPECT_EQ(maps_->Find(0x17000)->GetElf(memory_, ARCH_ARM), app_two_elf1);
321   EXPECT_EQ(0x4000U, maps_->Find(0x17000)->elf_start_offset());
322   EXPECT_EQ(0U, maps_->Find(0x17000)->elf_offset());
323   EXPECT_EQ(0x4000U, maps_->Find(0x17000)->offset());
324 
325   EXPECT_EQ(maps_->Find(0x19000)->GetElf(memory_, ARCH_ARM), app_two_elf2);
326   EXPECT_EQ(0x8000U, maps_->Find(0x19000)->elf_start_offset());
327   EXPECT_EQ(0U, maps_->Find(0x19000)->elf_offset());
328   EXPECT_EQ(0x8000U, maps_->Find(0x19000)->offset());
329 }
330 
331 // Verify that with elf caching disabled, we aren't caching improperly.
TEST_F(ElfCacheTest,verify_disable_elf_caching)332 TEST_F(ElfCacheTest, verify_disable_elf_caching) {
333   Elf::SetCachingEnabled(false);
334 
335   Elf* elf_one = maps_->Find(0x1000)->GetElf(memory_, ARCH_ARM);
336   ASSERT_TRUE(elf_one->valid());
337   Elf* elf_two = maps_->Find(0x2000)->GetElf(memory_, ARCH_ARM);
338   EXPECT_TRUE(elf_two->valid());
339   Elf* elf_three = maps_->Find(0x4000)->GetElf(memory_, ARCH_ARM);
340   ASSERT_TRUE(elf_three->valid());
341   EXPECT_EQ(maps_->Find(0x5000)->GetElf(memory_, ARCH_ARM), elf_three);
342 
343   EXPECT_NE(maps_->Find(0x10000)->GetElf(memory_, ARCH_ARM), elf_two);
344   EXPECT_NE(maps_->Find(0x11000)->GetElf(memory_, ARCH_ARM), elf_one);
345   EXPECT_NE(maps_->Find(0x12000)->GetElf(memory_, ARCH_ARM), elf_three);
346   EXPECT_NE(maps_->Find(0x13000)->GetElf(memory_, ARCH_ARM), elf_three);
347 
348   Elf* app_one_elf1 = maps_->Find(0x7000)->GetElf(memory_, ARCH_ARM);
349   ASSERT_TRUE(app_one_elf1->valid());
350   Elf* app_one_elf2 = maps_->Find(0x8000)->GetElf(memory_, ARCH_ARM);
351   ASSERT_TRUE(app_one_elf2->valid());
352   Elf* app_two_elf1 = maps_->Find(0x9000)->GetElf(memory_, ARCH_ARM);
353   ASSERT_TRUE(app_two_elf1->valid());
354   EXPECT_EQ(maps_->Find(0xa000)->GetElf(memory_, ARCH_ARM), app_two_elf1);
355   Elf* app_two_elf2 = maps_->Find(0xb000)->GetElf(memory_, ARCH_ARM);
356   ASSERT_TRUE(app_two_elf2->valid());
357   EXPECT_EQ(maps_->Find(0xc000)->GetElf(memory_, ARCH_ARM), app_two_elf2);
358 
359   EXPECT_NE(maps_->Find(0x15000)->GetElf(memory_, ARCH_ARM), app_one_elf1);
360   EXPECT_NE(maps_->Find(0x16000)->GetElf(memory_, ARCH_ARM), app_one_elf2);
361   EXPECT_NE(maps_->Find(0x17000)->GetElf(memory_, ARCH_ARM), app_two_elf1);
362   EXPECT_NE(maps_->Find(0x18000)->GetElf(memory_, ARCH_ARM), app_two_elf1);
363   EXPECT_NE(maps_->Find(0x19000)->GetElf(memory_, ARCH_ARM), app_two_elf2);
364   EXPECT_NE(maps_->Find(0x1a000)->GetElf(memory_, ARCH_ARM), app_two_elf2);
365 }
366 
367 // Verify that invalid elf objects are not cached.
TEST_F(ElfCacheTest,verify_invalid_not_cached)368 TEST_F(ElfCacheTest, verify_invalid_not_cached) {
369   Elf* invalid_elf1 = maps_->Find(0xe000)->GetElf(memory_, ARCH_ARM);
370   ASSERT_FALSE(invalid_elf1->valid());
371   Elf* invalid_elf2 = maps_->Find(0xf000)->GetElf(memory_, ARCH_ARM);
372   ASSERT_FALSE(invalid_elf2->valid());
373   ASSERT_NE(invalid_elf1, invalid_elf2);
374 }
375 
376 }  // namespace unwindstack
377