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