1 /* 2 * Copyright (C) 2016 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 19 #include <memory> 20 21 #include <gtest/gtest.h> 22 23 #include <unwindstack/ElfInterface.h> 24 25 #include "DwarfEncoding.h" 26 #include "ElfInterfaceArm.h" 27 28 #include "ElfFake.h" 29 #include "MemoryFake.h" 30 31 #if !defined(PT_ARM_EXIDX) 32 #define PT_ARM_EXIDX 0x70000001 33 #endif 34 35 #if !defined(EM_AARCH64) 36 #define EM_AARCH64 183 37 #endif 38 39 namespace unwindstack { 40 41 class ElfInterfaceTest : public ::testing::Test { 42 protected: 43 void SetUp() override { 44 memory_.Clear(); 45 } 46 47 void SetStringMemory(uint64_t offset, const char* string) { 48 memory_.SetMemory(offset, string, strlen(string) + 1); 49 } 50 51 template <typename Ehdr, typename Phdr, typename Dyn, typename ElfInterfaceType> 52 void SinglePtLoad(); 53 54 template <typename Ehdr, typename Phdr, typename Dyn, typename ElfInterfaceType> 55 void MultipleExecutablePtLoads(); 56 57 template <typename Ehdr, typename Phdr, typename Dyn, typename ElfInterfaceType> 58 void MultipleExecutablePtLoadsIncrementsNotSizeOfPhdr(); 59 60 template <typename Ehdr, typename Phdr, typename Dyn, typename ElfInterfaceType> 61 void NonExecutablePtLoads(); 62 63 template <typename Ehdr, typename Phdr, typename Dyn, typename ElfInterfaceType> 64 void ManyPhdrs(); 65 66 enum SonameTestEnum : uint8_t { 67 SONAME_NORMAL, 68 SONAME_DTNULL_AFTER, 69 SONAME_DTSIZE_SMALL, 70 SONAME_MISSING_MAP, 71 }; 72 73 template <typename Ehdr, typename Phdr, typename Shdr, typename Dyn> 74 void SonameInit(SonameTestEnum test_type = SONAME_NORMAL); 75 76 template <typename ElfInterfaceType> 77 void Soname(); 78 79 template <typename ElfInterfaceType> 80 void SonameAfterDtNull(); 81 82 template <typename ElfInterfaceType> 83 void SonameSize(); 84 85 template <typename ElfInterfaceType> 86 void SonameMissingMap(); 87 88 template <typename ElfType> 89 void InitHeadersEhFrameTest(); 90 91 template <typename ElfType> 92 void InitHeadersDebugFrame(); 93 94 template <typename ElfType> 95 void InitHeadersEhFrameFail(); 96 97 template <typename ElfType> 98 void InitHeadersDebugFrameFail(); 99 100 template <typename Ehdr, typename Shdr, typename ElfInterfaceType> 101 void InitSectionHeadersMalformed(); 102 103 template <typename Ehdr, typename Shdr, typename Sym, typename ElfInterfaceType> 104 void InitSectionHeaders(uint64_t entry_size); 105 106 template <typename Ehdr, typename Shdr, typename ElfInterfaceType> 107 void InitSectionHeadersOffsets(); 108 109 template <typename Sym> 110 void InitSym(uint64_t offset, uint32_t value, uint32_t size, uint32_t name_offset, 111 uint64_t sym_offset, const char* name); 112 113 MemoryFake memory_; 114 }; 115 116 template <typename Sym> 117 void ElfInterfaceTest::InitSym(uint64_t offset, uint32_t value, uint32_t size, uint32_t name_offset, 118 uint64_t sym_offset, const char* name) { 119 Sym sym; 120 memset(&sym, 0, sizeof(sym)); 121 sym.st_info = STT_FUNC; 122 sym.st_value = value; 123 sym.st_size = size; 124 sym.st_name = name_offset; 125 sym.st_shndx = SHN_COMMON; 126 127 memory_.SetMemory(offset, &sym, sizeof(sym)); 128 memory_.SetMemory(sym_offset + name_offset, name, strlen(name) + 1); 129 } 130 131 template <typename Ehdr, typename Phdr, typename Dyn, typename ElfInterfaceType> 132 void ElfInterfaceTest::SinglePtLoad() { 133 std::unique_ptr<ElfInterface> elf(new ElfInterfaceType(&memory_)); 134 135 Ehdr ehdr; 136 memset(&ehdr, 0, sizeof(ehdr)); 137 ehdr.e_phoff = 0x100; 138 ehdr.e_phnum = 1; 139 ehdr.e_phentsize = sizeof(Phdr); 140 memory_.SetMemory(0, &ehdr, sizeof(ehdr)); 141 142 Phdr phdr; 143 memset(&phdr, 0, sizeof(phdr)); 144 phdr.p_type = PT_LOAD; 145 phdr.p_vaddr = 0x2000; 146 phdr.p_memsz = 0x10000; 147 phdr.p_flags = PF_R | PF_X; 148 phdr.p_align = 0x1000; 149 memory_.SetMemory(0x100, &phdr, sizeof(phdr)); 150 151 uint64_t load_bias = 0; 152 ASSERT_TRUE(elf->Init(&load_bias)); 153 EXPECT_EQ(0x2000U, load_bias); 154 155 const std::unordered_map<uint64_t, LoadInfo>& pt_loads = elf->pt_loads(); 156 ASSERT_EQ(1U, pt_loads.size()); 157 LoadInfo load_data = pt_loads.at(0); 158 ASSERT_EQ(0U, load_data.offset); 159 ASSERT_EQ(0x2000U, load_data.table_offset); 160 ASSERT_EQ(0x10000U, load_data.table_size); 161 } 162 163 TEST_F(ElfInterfaceTest, elf32_single_pt_load) { 164 SinglePtLoad<Elf32_Ehdr, Elf32_Phdr, Elf32_Dyn, ElfInterface32>(); 165 } 166 167 TEST_F(ElfInterfaceTest, elf64_single_pt_load) { 168 SinglePtLoad<Elf64_Ehdr, Elf64_Phdr, Elf64_Dyn, ElfInterface64>(); 169 } 170 171 template <typename Ehdr, typename Phdr, typename Dyn, typename ElfInterfaceType> 172 void ElfInterfaceTest::MultipleExecutablePtLoads() { 173 std::unique_ptr<ElfInterface> elf(new ElfInterfaceType(&memory_)); 174 175 Ehdr ehdr; 176 memset(&ehdr, 0, sizeof(ehdr)); 177 ehdr.e_phoff = 0x100; 178 ehdr.e_phnum = 3; 179 ehdr.e_phentsize = sizeof(Phdr); 180 memory_.SetMemory(0, &ehdr, sizeof(ehdr)); 181 182 Phdr phdr; 183 memset(&phdr, 0, sizeof(phdr)); 184 phdr.p_type = PT_LOAD; 185 phdr.p_vaddr = 0x2000; 186 phdr.p_memsz = 0x10000; 187 phdr.p_flags = PF_R | PF_X; 188 phdr.p_align = 0x1000; 189 memory_.SetMemory(0x100, &phdr, sizeof(phdr)); 190 191 memset(&phdr, 0, sizeof(phdr)); 192 phdr.p_type = PT_LOAD; 193 phdr.p_offset = 0x1000; 194 phdr.p_vaddr = 0x2001; 195 phdr.p_memsz = 0x10001; 196 phdr.p_flags = PF_R | PF_X; 197 phdr.p_align = 0x1001; 198 memory_.SetMemory(0x100 + sizeof(phdr), &phdr, sizeof(phdr)); 199 200 memset(&phdr, 0, sizeof(phdr)); 201 phdr.p_type = PT_LOAD; 202 phdr.p_offset = 0x2000; 203 phdr.p_vaddr = 0x2002; 204 phdr.p_memsz = 0x10002; 205 phdr.p_flags = PF_R | PF_X; 206 phdr.p_align = 0x1002; 207 memory_.SetMemory(0x100 + 2 * sizeof(phdr), &phdr, sizeof(phdr)); 208 209 uint64_t load_bias = 0; 210 ASSERT_TRUE(elf->Init(&load_bias)); 211 EXPECT_EQ(0x2000U, load_bias); 212 213 const std::unordered_map<uint64_t, LoadInfo>& pt_loads = elf->pt_loads(); 214 ASSERT_EQ(3U, pt_loads.size()); 215 216 LoadInfo load_data = pt_loads.at(0); 217 ASSERT_EQ(0U, load_data.offset); 218 ASSERT_EQ(0x2000U, load_data.table_offset); 219 ASSERT_EQ(0x10000U, load_data.table_size); 220 221 load_data = pt_loads.at(0x1000); 222 ASSERT_EQ(0x1000U, load_data.offset); 223 ASSERT_EQ(0x2001U, load_data.table_offset); 224 ASSERT_EQ(0x10001U, load_data.table_size); 225 226 load_data = pt_loads.at(0x2000); 227 ASSERT_EQ(0x2000U, load_data.offset); 228 ASSERT_EQ(0x2002U, load_data.table_offset); 229 ASSERT_EQ(0x10002U, load_data.table_size); 230 } 231 232 TEST_F(ElfInterfaceTest, elf32_multiple_executable_pt_loads) { 233 MultipleExecutablePtLoads<Elf32_Ehdr, Elf32_Phdr, Elf32_Dyn, ElfInterface32>(); 234 } 235 236 TEST_F(ElfInterfaceTest, elf64_multiple_executable_pt_loads) { 237 MultipleExecutablePtLoads<Elf64_Ehdr, Elf64_Phdr, Elf64_Dyn, ElfInterface64>(); 238 } 239 240 template <typename Ehdr, typename Phdr, typename Dyn, typename ElfInterfaceType> 241 void ElfInterfaceTest::MultipleExecutablePtLoadsIncrementsNotSizeOfPhdr() { 242 std::unique_ptr<ElfInterface> elf(new ElfInterfaceType(&memory_)); 243 244 Ehdr ehdr; 245 memset(&ehdr, 0, sizeof(ehdr)); 246 ehdr.e_phoff = 0x100; 247 ehdr.e_phnum = 3; 248 ehdr.e_phentsize = sizeof(Phdr) + 100; 249 memory_.SetMemory(0, &ehdr, sizeof(ehdr)); 250 251 Phdr phdr; 252 memset(&phdr, 0, sizeof(phdr)); 253 phdr.p_type = PT_LOAD; 254 phdr.p_vaddr = 0x2000; 255 phdr.p_memsz = 0x10000; 256 phdr.p_flags = PF_R | PF_X; 257 phdr.p_align = 0x1000; 258 memory_.SetMemory(0x100, &phdr, sizeof(phdr)); 259 260 memset(&phdr, 0, sizeof(phdr)); 261 phdr.p_type = PT_LOAD; 262 phdr.p_offset = 0x1000; 263 phdr.p_vaddr = 0x2001; 264 phdr.p_memsz = 0x10001; 265 phdr.p_flags = PF_R | PF_X; 266 phdr.p_align = 0x1001; 267 memory_.SetMemory(0x100 + sizeof(phdr) + 100, &phdr, sizeof(phdr)); 268 269 memset(&phdr, 0, sizeof(phdr)); 270 phdr.p_type = PT_LOAD; 271 phdr.p_offset = 0x2000; 272 phdr.p_vaddr = 0x2002; 273 phdr.p_memsz = 0x10002; 274 phdr.p_flags = PF_R | PF_X; 275 phdr.p_align = 0x1002; 276 memory_.SetMemory(0x100 + 2 * (sizeof(phdr) + 100), &phdr, sizeof(phdr)); 277 278 uint64_t load_bias = 0; 279 ASSERT_TRUE(elf->Init(&load_bias)); 280 EXPECT_EQ(0x2000U, load_bias); 281 282 const std::unordered_map<uint64_t, LoadInfo>& pt_loads = elf->pt_loads(); 283 ASSERT_EQ(3U, pt_loads.size()); 284 285 LoadInfo load_data = pt_loads.at(0); 286 ASSERT_EQ(0U, load_data.offset); 287 ASSERT_EQ(0x2000U, load_data.table_offset); 288 ASSERT_EQ(0x10000U, load_data.table_size); 289 290 load_data = pt_loads.at(0x1000); 291 ASSERT_EQ(0x1000U, load_data.offset); 292 ASSERT_EQ(0x2001U, load_data.table_offset); 293 ASSERT_EQ(0x10001U, load_data.table_size); 294 295 load_data = pt_loads.at(0x2000); 296 ASSERT_EQ(0x2000U, load_data.offset); 297 ASSERT_EQ(0x2002U, load_data.table_offset); 298 ASSERT_EQ(0x10002U, load_data.table_size); 299 } 300 301 TEST_F(ElfInterfaceTest, elf32_multiple_executable_pt_loads_increments_not_size_of_phdr) { 302 MultipleExecutablePtLoadsIncrementsNotSizeOfPhdr<Elf32_Ehdr, Elf32_Phdr, Elf32_Dyn, 303 ElfInterface32>(); 304 } 305 306 TEST_F(ElfInterfaceTest, elf64_multiple_executable_pt_loads_increments_not_size_of_phdr) { 307 MultipleExecutablePtLoadsIncrementsNotSizeOfPhdr<Elf64_Ehdr, Elf64_Phdr, Elf64_Dyn, 308 ElfInterface64>(); 309 } 310 311 template <typename Ehdr, typename Phdr, typename Dyn, typename ElfInterfaceType> 312 void ElfInterfaceTest::NonExecutablePtLoads() { 313 std::unique_ptr<ElfInterface> elf(new ElfInterfaceType(&memory_)); 314 315 Ehdr ehdr; 316 memset(&ehdr, 0, sizeof(ehdr)); 317 ehdr.e_phoff = 0x100; 318 ehdr.e_phnum = 3; 319 ehdr.e_phentsize = sizeof(Phdr); 320 memory_.SetMemory(0, &ehdr, sizeof(ehdr)); 321 322 Phdr phdr; 323 memset(&phdr, 0, sizeof(phdr)); 324 phdr.p_type = PT_LOAD; 325 phdr.p_vaddr = 0x2000; 326 phdr.p_memsz = 0x10000; 327 phdr.p_flags = PF_R; 328 phdr.p_align = 0x1000; 329 memory_.SetMemory(0x100, &phdr, sizeof(phdr)); 330 331 memset(&phdr, 0, sizeof(phdr)); 332 phdr.p_type = PT_LOAD; 333 phdr.p_offset = 0x1000; 334 phdr.p_vaddr = 0x2001; 335 phdr.p_memsz = 0x10001; 336 phdr.p_flags = PF_R | PF_X; 337 phdr.p_align = 0x1001; 338 memory_.SetMemory(0x100 + sizeof(phdr), &phdr, sizeof(phdr)); 339 340 memset(&phdr, 0, sizeof(phdr)); 341 phdr.p_type = PT_LOAD; 342 phdr.p_offset = 0x2000; 343 phdr.p_vaddr = 0x2002; 344 phdr.p_memsz = 0x10002; 345 phdr.p_flags = PF_R; 346 phdr.p_align = 0x1002; 347 memory_.SetMemory(0x100 + 2 * sizeof(phdr), &phdr, sizeof(phdr)); 348 349 uint64_t load_bias = 0; 350 ASSERT_TRUE(elf->Init(&load_bias)); 351 EXPECT_EQ(0U, load_bias); 352 353 const std::unordered_map<uint64_t, LoadInfo>& pt_loads = elf->pt_loads(); 354 ASSERT_EQ(1U, pt_loads.size()); 355 356 LoadInfo load_data = pt_loads.at(0x1000); 357 ASSERT_EQ(0x1000U, load_data.offset); 358 ASSERT_EQ(0x2001U, load_data.table_offset); 359 ASSERT_EQ(0x10001U, load_data.table_size); 360 } 361 362 TEST_F(ElfInterfaceTest, elf32_non_executable_pt_loads) { 363 NonExecutablePtLoads<Elf32_Ehdr, Elf32_Phdr, Elf32_Dyn, ElfInterface32>(); 364 } 365 366 TEST_F(ElfInterfaceTest, elf64_non_executable_pt_loads) { 367 NonExecutablePtLoads<Elf64_Ehdr, Elf64_Phdr, Elf64_Dyn, ElfInterface64>(); 368 } 369 370 template <typename Ehdr, typename Phdr, typename Dyn, typename ElfInterfaceType> 371 void ElfInterfaceTest::ManyPhdrs() { 372 std::unique_ptr<ElfInterface> elf(new ElfInterfaceType(&memory_)); 373 374 Ehdr ehdr; 375 memset(&ehdr, 0, sizeof(ehdr)); 376 ehdr.e_phoff = 0x100; 377 ehdr.e_phnum = 7; 378 ehdr.e_phentsize = sizeof(Phdr); 379 memory_.SetMemory(0, &ehdr, sizeof(ehdr)); 380 381 Phdr phdr; 382 uint64_t phdr_offset = 0x100; 383 384 memset(&phdr, 0, sizeof(phdr)); 385 phdr.p_type = PT_LOAD; 386 phdr.p_vaddr = 0x2000; 387 phdr.p_memsz = 0x10000; 388 phdr.p_flags = PF_R | PF_X; 389 phdr.p_align = 0x1000; 390 memory_.SetMemory(phdr_offset, &phdr, sizeof(phdr)); 391 phdr_offset += sizeof(phdr); 392 393 memset(&phdr, 0, sizeof(phdr)); 394 phdr.p_type = PT_GNU_EH_FRAME; 395 memory_.SetMemory(phdr_offset, &phdr, sizeof(phdr)); 396 phdr_offset += sizeof(phdr); 397 398 memset(&phdr, 0, sizeof(phdr)); 399 phdr.p_type = PT_DYNAMIC; 400 memory_.SetMemory(phdr_offset, &phdr, sizeof(phdr)); 401 phdr_offset += sizeof(phdr); 402 403 memset(&phdr, 0, sizeof(phdr)); 404 phdr.p_type = PT_INTERP; 405 memory_.SetMemory(phdr_offset, &phdr, sizeof(phdr)); 406 phdr_offset += sizeof(phdr); 407 408 memset(&phdr, 0, sizeof(phdr)); 409 phdr.p_type = PT_NOTE; 410 memory_.SetMemory(phdr_offset, &phdr, sizeof(phdr)); 411 phdr_offset += sizeof(phdr); 412 413 memset(&phdr, 0, sizeof(phdr)); 414 phdr.p_type = PT_SHLIB; 415 memory_.SetMemory(phdr_offset, &phdr, sizeof(phdr)); 416 phdr_offset += sizeof(phdr); 417 418 memset(&phdr, 0, sizeof(phdr)); 419 phdr.p_type = PT_GNU_EH_FRAME; 420 memory_.SetMemory(phdr_offset, &phdr, sizeof(phdr)); 421 phdr_offset += sizeof(phdr); 422 423 uint64_t load_bias = 0; 424 ASSERT_TRUE(elf->Init(&load_bias)); 425 EXPECT_EQ(0x2000U, load_bias); 426 427 const std::unordered_map<uint64_t, LoadInfo>& pt_loads = elf->pt_loads(); 428 ASSERT_EQ(1U, pt_loads.size()); 429 430 LoadInfo load_data = pt_loads.at(0); 431 ASSERT_EQ(0U, load_data.offset); 432 ASSERT_EQ(0x2000U, load_data.table_offset); 433 ASSERT_EQ(0x10000U, load_data.table_size); 434 } 435 436 TEST_F(ElfInterfaceTest, elf32_many_phdrs) { 437 ElfInterfaceTest::ManyPhdrs<Elf32_Ehdr, Elf32_Phdr, Elf32_Dyn, ElfInterface32>(); 438 } 439 440 TEST_F(ElfInterfaceTest, elf64_many_phdrs) { 441 ElfInterfaceTest::ManyPhdrs<Elf64_Ehdr, Elf64_Phdr, Elf64_Dyn, ElfInterface64>(); 442 } 443 444 TEST_F(ElfInterfaceTest, elf32_arm) { 445 ElfInterfaceArm elf_arm(&memory_); 446 447 Elf32_Ehdr ehdr; 448 memset(&ehdr, 0, sizeof(ehdr)); 449 ehdr.e_phoff = 0x100; 450 ehdr.e_phnum = 1; 451 ehdr.e_phentsize = sizeof(Elf32_Phdr); 452 memory_.SetMemory(0, &ehdr, sizeof(ehdr)); 453 454 Elf32_Phdr phdr; 455 memset(&phdr, 0, sizeof(phdr)); 456 phdr.p_type = PT_ARM_EXIDX; 457 phdr.p_vaddr = 0x2000; 458 phdr.p_memsz = 16; 459 memory_.SetMemory(0x100, &phdr, sizeof(phdr)); 460 461 // Add arm exidx entries. 462 memory_.SetData32(0x2000, 0x1000); 463 memory_.SetData32(0x2008, 0x1000); 464 465 uint64_t load_bias = 0; 466 ASSERT_TRUE(elf_arm.Init(&load_bias)); 467 EXPECT_EQ(0U, load_bias); 468 469 std::vector<uint32_t> entries; 470 for (auto addr : elf_arm) { 471 entries.push_back(addr); 472 } 473 ASSERT_EQ(2U, entries.size()); 474 ASSERT_EQ(0x3000U, entries[0]); 475 ASSERT_EQ(0x3008U, entries[1]); 476 477 ASSERT_EQ(0x2000U, elf_arm.start_offset()); 478 ASSERT_EQ(2U, elf_arm.total_entries()); 479 } 480 481 template <typename Ehdr, typename Phdr, typename Shdr, typename Dyn> 482 void ElfInterfaceTest::SonameInit(SonameTestEnum test_type) { 483 Ehdr ehdr; 484 memset(&ehdr, 0, sizeof(ehdr)); 485 ehdr.e_shoff = 0x200; 486 ehdr.e_shnum = 2; 487 ehdr.e_shentsize = sizeof(Shdr); 488 ehdr.e_phoff = 0x100; 489 ehdr.e_phnum = 1; 490 ehdr.e_phentsize = sizeof(Phdr); 491 memory_.SetMemory(0, &ehdr, sizeof(ehdr)); 492 493 Shdr shdr; 494 memset(&shdr, 0, sizeof(shdr)); 495 shdr.sh_type = SHT_STRTAB; 496 if (test_type == SONAME_MISSING_MAP) { 497 shdr.sh_addr = 0x20100; 498 } else { 499 shdr.sh_addr = 0x10100; 500 } 501 shdr.sh_offset = 0x10000; 502 memory_.SetMemory(0x200 + sizeof(shdr), &shdr, sizeof(shdr)); 503 504 Phdr phdr; 505 memset(&phdr, 0, sizeof(phdr)); 506 phdr.p_type = PT_DYNAMIC; 507 phdr.p_offset = 0x2000; 508 phdr.p_memsz = sizeof(Dyn) * 3; 509 memory_.SetMemory(0x100, &phdr, sizeof(phdr)); 510 511 uint64_t offset = 0x2000; 512 Dyn dyn; 513 514 dyn.d_tag = DT_STRTAB; 515 dyn.d_un.d_ptr = 0x10100; 516 memory_.SetMemory(offset, &dyn, sizeof(dyn)); 517 offset += sizeof(dyn); 518 519 dyn.d_tag = DT_STRSZ; 520 if (test_type == SONAME_DTSIZE_SMALL) { 521 dyn.d_un.d_val = 0x10; 522 } else { 523 dyn.d_un.d_val = 0x1000; 524 } 525 memory_.SetMemory(offset, &dyn, sizeof(dyn)); 526 offset += sizeof(dyn); 527 528 if (test_type == SONAME_DTNULL_AFTER) { 529 dyn.d_tag = DT_NULL; 530 memory_.SetMemory(offset, &dyn, sizeof(dyn)); 531 offset += sizeof(dyn); 532 } 533 534 dyn.d_tag = DT_SONAME; 535 dyn.d_un.d_val = 0x10; 536 memory_.SetMemory(offset, &dyn, sizeof(dyn)); 537 offset += sizeof(dyn); 538 539 dyn.d_tag = DT_NULL; 540 memory_.SetMemory(offset, &dyn, sizeof(dyn)); 541 542 SetStringMemory(0x10010, "fake_soname.so"); 543 } 544 545 template <typename ElfInterfaceType> 546 void ElfInterfaceTest::Soname() { 547 std::unique_ptr<ElfInterface> elf(new ElfInterfaceType(&memory_)); 548 549 uint64_t load_bias = 0; 550 ASSERT_TRUE(elf->Init(&load_bias)); 551 EXPECT_EQ(0U, load_bias); 552 553 std::string name; 554 ASSERT_TRUE(elf->GetSoname(&name)); 555 ASSERT_STREQ("fake_soname.so", name.c_str()); 556 } 557 558 TEST_F(ElfInterfaceTest, elf32_soname) { 559 SonameInit<Elf32_Ehdr, Elf32_Phdr, Elf32_Shdr, Elf32_Dyn>(); 560 Soname<ElfInterface32>(); 561 } 562 563 TEST_F(ElfInterfaceTest, elf64_soname) { 564 SonameInit<Elf64_Ehdr, Elf64_Phdr, Elf64_Shdr, Elf64_Dyn>(); 565 Soname<ElfInterface64>(); 566 } 567 568 template <typename ElfInterfaceType> 569 void ElfInterfaceTest::SonameAfterDtNull() { 570 std::unique_ptr<ElfInterface> elf(new ElfInterfaceType(&memory_)); 571 572 uint64_t load_bias = 0; 573 ASSERT_TRUE(elf->Init(&load_bias)); 574 EXPECT_EQ(0U, load_bias); 575 576 std::string name; 577 ASSERT_FALSE(elf->GetSoname(&name)); 578 } 579 580 TEST_F(ElfInterfaceTest, elf32_soname_after_dt_null) { 581 SonameInit<Elf32_Ehdr, Elf32_Phdr, Elf32_Shdr, Elf32_Dyn>(SONAME_DTNULL_AFTER); 582 SonameAfterDtNull<ElfInterface32>(); 583 } 584 585 TEST_F(ElfInterfaceTest, elf64_soname_after_dt_null) { 586 SonameInit<Elf64_Ehdr, Elf64_Phdr, Elf64_Shdr, Elf64_Dyn>(SONAME_DTNULL_AFTER); 587 SonameAfterDtNull<ElfInterface64>(); 588 } 589 590 template <typename ElfInterfaceType> 591 void ElfInterfaceTest::SonameSize() { 592 std::unique_ptr<ElfInterface> elf(new ElfInterfaceType(&memory_)); 593 594 uint64_t load_bias = 0; 595 ASSERT_TRUE(elf->Init(&load_bias)); 596 EXPECT_EQ(0U, load_bias); 597 598 std::string name; 599 ASSERT_FALSE(elf->GetSoname(&name)); 600 } 601 602 TEST_F(ElfInterfaceTest, elf32_soname_size) { 603 SonameInit<Elf32_Ehdr, Elf32_Phdr, Elf32_Shdr, Elf32_Dyn>(SONAME_DTSIZE_SMALL); 604 SonameSize<ElfInterface32>(); 605 } 606 607 TEST_F(ElfInterfaceTest, elf64_soname_size) { 608 SonameInit<Elf64_Ehdr, Elf64_Phdr, Elf64_Shdr, Elf64_Dyn>(SONAME_DTSIZE_SMALL); 609 SonameSize<ElfInterface64>(); 610 } 611 612 // Verify that there is no map from STRTAB in the dynamic section to a 613 // STRTAB entry in the section headers. 614 template <typename ElfInterfaceType> 615 void ElfInterfaceTest::SonameMissingMap() { 616 std::unique_ptr<ElfInterface> elf(new ElfInterfaceType(&memory_)); 617 618 uint64_t load_bias = 0; 619 ASSERT_TRUE(elf->Init(&load_bias)); 620 EXPECT_EQ(0U, load_bias); 621 622 std::string name; 623 ASSERT_FALSE(elf->GetSoname(&name)); 624 } 625 626 TEST_F(ElfInterfaceTest, elf32_soname_missing_map) { 627 SonameInit<Elf32_Ehdr, Elf32_Phdr, Elf32_Shdr, Elf32_Dyn>(SONAME_MISSING_MAP); 628 SonameMissingMap<ElfInterface32>(); 629 } 630 631 TEST_F(ElfInterfaceTest, elf64_soname_missing_map) { 632 SonameInit<Elf64_Ehdr, Elf64_Phdr, Elf64_Shdr, Elf64_Dyn>(SONAME_MISSING_MAP); 633 SonameMissingMap<ElfInterface64>(); 634 } 635 636 template <typename ElfType> 637 void ElfInterfaceTest::InitHeadersEhFrameTest() { 638 ElfType elf(&memory_); 639 640 elf.FakeSetEhFrameOffset(0x10000); 641 elf.FakeSetEhFrameSize(0); 642 elf.FakeSetDebugFrameOffset(0); 643 elf.FakeSetDebugFrameSize(0); 644 645 memory_.SetMemory(0x10000, 646 std::vector<uint8_t>{0x1, DW_EH_PE_udata2, DW_EH_PE_udata2, DW_EH_PE_udata2}); 647 memory_.SetData32(0x10004, 0x500); 648 memory_.SetData32(0x10008, 250); 649 650 elf.InitHeaders(); 651 652 EXPECT_FALSE(elf.eh_frame() == nullptr); 653 EXPECT_TRUE(elf.debug_frame() == nullptr); 654 } 655 656 TEST_F(ElfInterfaceTest, init_headers_eh_frame32) { 657 InitHeadersEhFrameTest<ElfInterface32Fake>(); 658 } 659 660 TEST_F(ElfInterfaceTest, init_headers_eh_frame64) { 661 InitHeadersEhFrameTest<ElfInterface64Fake>(); 662 } 663 664 template <typename ElfType> 665 void ElfInterfaceTest::InitHeadersDebugFrame() { 666 ElfType elf(&memory_); 667 668 elf.FakeSetEhFrameOffset(0); 669 elf.FakeSetEhFrameSize(0); 670 elf.FakeSetDebugFrameOffset(0x5000); 671 elf.FakeSetDebugFrameSize(0x200); 672 673 memory_.SetData32(0x5000, 0xfc); 674 memory_.SetData32(0x5004, 0xffffffff); 675 memory_.SetData8(0x5008, 1); 676 memory_.SetData8(0x5009, '\0'); 677 678 memory_.SetData32(0x5100, 0xfc); 679 memory_.SetData32(0x5104, 0); 680 memory_.SetData32(0x5108, 0x1500); 681 memory_.SetData32(0x510c, 0x200); 682 683 elf.InitHeaders(); 684 685 EXPECT_TRUE(elf.eh_frame() == nullptr); 686 EXPECT_FALSE(elf.debug_frame() == nullptr); 687 } 688 689 TEST_F(ElfInterfaceTest, init_headers_debug_frame32) { 690 InitHeadersDebugFrame<ElfInterface32Fake>(); 691 } 692 693 TEST_F(ElfInterfaceTest, init_headers_debug_frame64) { 694 InitHeadersDebugFrame<ElfInterface64Fake>(); 695 } 696 697 template <typename ElfType> 698 void ElfInterfaceTest::InitHeadersEhFrameFail() { 699 ElfType elf(&memory_); 700 701 elf.FakeSetEhFrameOffset(0x1000); 702 elf.FakeSetEhFrameSize(0x100); 703 elf.FakeSetDebugFrameOffset(0); 704 elf.FakeSetDebugFrameSize(0); 705 706 elf.InitHeaders(); 707 708 EXPECT_TRUE(elf.eh_frame() == nullptr); 709 EXPECT_EQ(0U, elf.eh_frame_offset()); 710 EXPECT_EQ(static_cast<uint64_t>(-1), elf.eh_frame_size()); 711 EXPECT_TRUE(elf.debug_frame() == nullptr); 712 } 713 714 TEST_F(ElfInterfaceTest, init_headers_eh_frame32_fail) { 715 InitHeadersEhFrameFail<ElfInterface32Fake>(); 716 } 717 718 TEST_F(ElfInterfaceTest, init_headers_eh_frame64_fail) { 719 InitHeadersEhFrameFail<ElfInterface64Fake>(); 720 } 721 722 template <typename ElfType> 723 void ElfInterfaceTest::InitHeadersDebugFrameFail() { 724 ElfType elf(&memory_); 725 726 elf.FakeSetEhFrameOffset(0); 727 elf.FakeSetEhFrameSize(0); 728 elf.FakeSetDebugFrameOffset(0x1000); 729 elf.FakeSetDebugFrameSize(0x100); 730 731 elf.InitHeaders(); 732 733 EXPECT_TRUE(elf.eh_frame() == nullptr); 734 EXPECT_TRUE(elf.debug_frame() == nullptr); 735 EXPECT_EQ(0U, elf.debug_frame_offset()); 736 EXPECT_EQ(static_cast<uint64_t>(-1), elf.debug_frame_size()); 737 } 738 739 TEST_F(ElfInterfaceTest, init_headers_debug_frame32_fail) { 740 InitHeadersDebugFrameFail<ElfInterface32Fake>(); 741 } 742 743 TEST_F(ElfInterfaceTest, init_headers_debug_frame64_fail) { 744 InitHeadersDebugFrameFail<ElfInterface64Fake>(); 745 } 746 747 template <typename Ehdr, typename Shdr, typename ElfInterfaceType> 748 void ElfInterfaceTest::InitSectionHeadersMalformed() { 749 std::unique_ptr<ElfInterfaceType> elf(new ElfInterfaceType(&memory_)); 750 751 Ehdr ehdr; 752 memset(&ehdr, 0, sizeof(ehdr)); 753 ehdr.e_shoff = 0x1000; 754 ehdr.e_shnum = 10; 755 ehdr.e_shentsize = sizeof(Shdr); 756 memory_.SetMemory(0, &ehdr, sizeof(ehdr)); 757 758 uint64_t load_bias = 0; 759 ASSERT_TRUE(elf->Init(&load_bias)); 760 EXPECT_EQ(0U, load_bias); 761 } 762 763 TEST_F(ElfInterfaceTest, init_section_headers_malformed32) { 764 InitSectionHeadersMalformed<Elf32_Ehdr, Elf32_Shdr, ElfInterface32>(); 765 } 766 767 TEST_F(ElfInterfaceTest, init_section_headers_malformed64) { 768 InitSectionHeadersMalformed<Elf64_Ehdr, Elf64_Shdr, ElfInterface64>(); 769 } 770 771 template <typename Ehdr, typename Shdr, typename Sym, typename ElfInterfaceType> 772 void ElfInterfaceTest::InitSectionHeaders(uint64_t entry_size) { 773 std::unique_ptr<ElfInterfaceType> elf(new ElfInterfaceType(&memory_)); 774 775 uint64_t offset = 0x1000; 776 777 Ehdr ehdr; 778 memset(&ehdr, 0, sizeof(ehdr)); 779 ehdr.e_shoff = offset; 780 ehdr.e_shnum = 10; 781 ehdr.e_shentsize = entry_size; 782 memory_.SetMemory(0, &ehdr, sizeof(ehdr)); 783 784 offset += ehdr.e_shentsize; 785 786 Shdr shdr; 787 memset(&shdr, 0, sizeof(shdr)); 788 shdr.sh_type = SHT_SYMTAB; 789 shdr.sh_link = 4; 790 shdr.sh_addr = 0x5000; 791 shdr.sh_offset = 0x5000; 792 shdr.sh_entsize = sizeof(Sym); 793 shdr.sh_size = shdr.sh_entsize * 10; 794 memory_.SetMemory(offset, &shdr, sizeof(shdr)); 795 offset += ehdr.e_shentsize; 796 797 memset(&shdr, 0, sizeof(shdr)); 798 shdr.sh_type = SHT_DYNSYM; 799 shdr.sh_link = 4; 800 shdr.sh_addr = 0x6000; 801 shdr.sh_offset = 0x6000; 802 shdr.sh_entsize = sizeof(Sym); 803 shdr.sh_size = shdr.sh_entsize * 10; 804 memory_.SetMemory(offset, &shdr, sizeof(shdr)); 805 offset += ehdr.e_shentsize; 806 807 memset(&shdr, 0, sizeof(shdr)); 808 shdr.sh_type = SHT_PROGBITS; 809 shdr.sh_name = 0xa000; 810 memory_.SetMemory(offset, &shdr, sizeof(shdr)); 811 offset += ehdr.e_shentsize; 812 813 // The string data for the entries. 814 memset(&shdr, 0, sizeof(shdr)); 815 shdr.sh_type = SHT_STRTAB; 816 shdr.sh_name = 0x20000; 817 shdr.sh_offset = 0xf000; 818 shdr.sh_size = 0x1000; 819 memory_.SetMemory(offset, &shdr, sizeof(shdr)); 820 offset += ehdr.e_shentsize; 821 822 InitSym<Sym>(0x5000, 0x90000, 0x1000, 0x100, 0xf000, "function_one"); 823 InitSym<Sym>(0x6000, 0xd0000, 0x1000, 0x300, 0xf000, "function_two"); 824 825 uint64_t load_bias = 0; 826 ASSERT_TRUE(elf->Init(&load_bias)); 827 EXPECT_EQ(0U, load_bias); 828 EXPECT_EQ(0U, elf->debug_frame_offset()); 829 EXPECT_EQ(0U, elf->debug_frame_size()); 830 EXPECT_EQ(0U, elf->gnu_debugdata_offset()); 831 EXPECT_EQ(0U, elf->gnu_debugdata_size()); 832 833 // Look in the first symbol table. 834 std::string name; 835 uint64_t name_offset; 836 ASSERT_TRUE(elf->GetFunctionName(0x90010, 0, &name, &name_offset)); 837 EXPECT_EQ("function_one", name); 838 EXPECT_EQ(16U, name_offset); 839 ASSERT_TRUE(elf->GetFunctionName(0xd0020, 0, &name, &name_offset)); 840 EXPECT_EQ("function_two", name); 841 EXPECT_EQ(32U, name_offset); 842 } 843 844 TEST_F(ElfInterfaceTest, init_section_headers32) { 845 InitSectionHeaders<Elf32_Ehdr, Elf32_Shdr, Elf32_Sym, ElfInterface32>(sizeof(Elf32_Shdr)); 846 } 847 848 TEST_F(ElfInterfaceTest, init_section_headers64) { 849 InitSectionHeaders<Elf64_Ehdr, Elf64_Shdr, Elf64_Sym, ElfInterface64>(sizeof(Elf64_Shdr)); 850 } 851 852 TEST_F(ElfInterfaceTest, init_section_headers_non_std_entry_size32) { 853 InitSectionHeaders<Elf32_Ehdr, Elf32_Shdr, Elf32_Sym, ElfInterface32>(0x100); 854 } 855 856 TEST_F(ElfInterfaceTest, init_section_headers_non_std_entry_size64) { 857 InitSectionHeaders<Elf64_Ehdr, Elf64_Shdr, Elf64_Sym, ElfInterface64>(0x100); 858 } 859 860 template <typename Ehdr, typename Shdr, typename ElfInterfaceType> 861 void ElfInterfaceTest::InitSectionHeadersOffsets() { 862 std::unique_ptr<ElfInterfaceType> elf(new ElfInterfaceType(&memory_)); 863 864 uint64_t offset = 0x2000; 865 866 Ehdr ehdr; 867 memset(&ehdr, 0, sizeof(ehdr)); 868 ehdr.e_shoff = offset; 869 ehdr.e_shnum = 10; 870 ehdr.e_shentsize = sizeof(Shdr); 871 ehdr.e_shstrndx = 2; 872 memory_.SetMemory(0, &ehdr, sizeof(ehdr)); 873 874 offset += ehdr.e_shentsize; 875 876 Shdr shdr; 877 memset(&shdr, 0, sizeof(shdr)); 878 shdr.sh_type = SHT_PROGBITS; 879 shdr.sh_link = 2; 880 shdr.sh_name = 0x200; 881 shdr.sh_addr = 0x5000; 882 shdr.sh_offset = 0x5000; 883 shdr.sh_entsize = 0x100; 884 shdr.sh_size = 0x800; 885 memory_.SetMemory(offset, &shdr, sizeof(shdr)); 886 offset += ehdr.e_shentsize; 887 888 // The string data for section header names. 889 memset(&shdr, 0, sizeof(shdr)); 890 shdr.sh_type = SHT_STRTAB; 891 shdr.sh_name = 0x20000; 892 shdr.sh_offset = 0xf000; 893 shdr.sh_size = 0x1000; 894 memory_.SetMemory(offset, &shdr, sizeof(shdr)); 895 offset += ehdr.e_shentsize; 896 897 memset(&shdr, 0, sizeof(shdr)); 898 shdr.sh_type = SHT_PROGBITS; 899 shdr.sh_link = 2; 900 shdr.sh_name = 0x100; 901 shdr.sh_addr = 0x6000; 902 shdr.sh_offset = 0x6000; 903 shdr.sh_entsize = 0x100; 904 shdr.sh_size = 0x500; 905 memory_.SetMemory(offset, &shdr, sizeof(shdr)); 906 offset += ehdr.e_shentsize; 907 908 memset(&shdr, 0, sizeof(shdr)); 909 shdr.sh_type = SHT_PROGBITS; 910 shdr.sh_link = 2; 911 shdr.sh_name = 0x300; 912 shdr.sh_addr = 0x7000; 913 shdr.sh_offset = 0x7000; 914 shdr.sh_entsize = 0x100; 915 shdr.sh_size = 0x800; 916 memory_.SetMemory(offset, &shdr, sizeof(shdr)); 917 offset += ehdr.e_shentsize; 918 919 memset(&shdr, 0, sizeof(shdr)); 920 shdr.sh_type = SHT_PROGBITS; 921 shdr.sh_link = 2; 922 shdr.sh_name = 0x400; 923 shdr.sh_addr = 0x6000; 924 shdr.sh_offset = 0xa000; 925 shdr.sh_entsize = 0x100; 926 shdr.sh_size = 0xf00; 927 memory_.SetMemory(offset, &shdr, sizeof(shdr)); 928 offset += ehdr.e_shentsize; 929 930 memory_.SetMemory(0xf100, ".debug_frame", sizeof(".debug_frame")); 931 memory_.SetMemory(0xf200, ".gnu_debugdata", sizeof(".gnu_debugdata")); 932 memory_.SetMemory(0xf300, ".eh_frame", sizeof(".eh_frame")); 933 memory_.SetMemory(0xf400, ".eh_frame_hdr", sizeof(".eh_frame_hdr")); 934 935 uint64_t load_bias = 0; 936 ASSERT_TRUE(elf->Init(&load_bias)); 937 EXPECT_EQ(0U, load_bias); 938 EXPECT_EQ(0x6000U, elf->debug_frame_offset()); 939 EXPECT_EQ(0x500U, elf->debug_frame_size()); 940 EXPECT_EQ(0x5000U, elf->gnu_debugdata_offset()); 941 EXPECT_EQ(0x800U, elf->gnu_debugdata_size()); 942 EXPECT_EQ(0x7000U, elf->eh_frame_offset()); 943 EXPECT_EQ(0x800U, elf->eh_frame_size()); 944 EXPECT_EQ(0xa000U, elf->eh_frame_hdr_offset()); 945 EXPECT_EQ(0xf00U, elf->eh_frame_hdr_size()); 946 } 947 948 TEST_F(ElfInterfaceTest, init_section_headers_offsets32) { 949 InitSectionHeadersOffsets<Elf32_Ehdr, Elf32_Shdr, ElfInterface32>(); 950 } 951 952 TEST_F(ElfInterfaceTest, init_section_headers_offsets64) { 953 InitSectionHeadersOffsets<Elf64_Ehdr, Elf64_Shdr, ElfInterface64>(); 954 } 955 956 TEST_F(ElfInterfaceTest, is_valid_pc_from_pt_load) { 957 std::unique_ptr<ElfInterface> elf(new ElfInterface32(&memory_)); 958 959 Elf32_Ehdr ehdr; 960 memset(&ehdr, 0, sizeof(ehdr)); 961 ehdr.e_phoff = 0x100; 962 ehdr.e_phnum = 1; 963 ehdr.e_phentsize = sizeof(Elf32_Phdr); 964 memory_.SetMemory(0, &ehdr, sizeof(ehdr)); 965 966 Elf32_Phdr phdr; 967 memset(&phdr, 0, sizeof(phdr)); 968 phdr.p_type = PT_LOAD; 969 phdr.p_vaddr = 0; 970 phdr.p_memsz = 0x10000; 971 phdr.p_flags = PF_R | PF_X; 972 phdr.p_align = 0x1000; 973 memory_.SetMemory(0x100, &phdr, sizeof(phdr)); 974 975 uint64_t load_bias = 0; 976 ASSERT_TRUE(elf->Init(&load_bias)); 977 EXPECT_EQ(0U, load_bias); 978 EXPECT_TRUE(elf->IsValidPc(0)); 979 EXPECT_TRUE(elf->IsValidPc(0x5000)); 980 EXPECT_TRUE(elf->IsValidPc(0xffff)); 981 EXPECT_FALSE(elf->IsValidPc(0x10000)); 982 } 983 984 TEST_F(ElfInterfaceTest, is_valid_pc_from_pt_load_non_zero_load_bias) { 985 std::unique_ptr<ElfInterface> elf(new ElfInterface32(&memory_)); 986 987 Elf32_Ehdr ehdr; 988 memset(&ehdr, 0, sizeof(ehdr)); 989 ehdr.e_phoff = 0x100; 990 ehdr.e_phnum = 1; 991 ehdr.e_phentsize = sizeof(Elf32_Phdr); 992 memory_.SetMemory(0, &ehdr, sizeof(ehdr)); 993 994 Elf32_Phdr phdr; 995 memset(&phdr, 0, sizeof(phdr)); 996 phdr.p_type = PT_LOAD; 997 phdr.p_vaddr = 0x2000; 998 phdr.p_memsz = 0x10000; 999 phdr.p_flags = PF_R | PF_X; 1000 phdr.p_align = 0x1000; 1001 memory_.SetMemory(0x100, &phdr, sizeof(phdr)); 1002 1003 uint64_t load_bias = 0; 1004 ASSERT_TRUE(elf->Init(&load_bias)); 1005 EXPECT_EQ(0x2000U, load_bias); 1006 EXPECT_FALSE(elf->IsValidPc(0)); 1007 EXPECT_FALSE(elf->IsValidPc(0x1000)); 1008 EXPECT_FALSE(elf->IsValidPc(0x1fff)); 1009 EXPECT_TRUE(elf->IsValidPc(0x2000)); 1010 EXPECT_TRUE(elf->IsValidPc(0x5000)); 1011 EXPECT_TRUE(elf->IsValidPc(0x11fff)); 1012 EXPECT_FALSE(elf->IsValidPc(0x12000)); 1013 } 1014 1015 TEST_F(ElfInterfaceTest, is_valid_pc_from_debug_frame) { 1016 std::unique_ptr<ElfInterface> elf(new ElfInterface32(&memory_)); 1017 1018 uint64_t sh_offset = 0x100; 1019 1020 Elf32_Ehdr ehdr; 1021 memset(&ehdr, 0, sizeof(ehdr)); 1022 ehdr.e_shstrndx = 1; 1023 ehdr.e_shoff = sh_offset; 1024 ehdr.e_shentsize = sizeof(Elf32_Shdr); 1025 ehdr.e_shnum = 3; 1026 memory_.SetMemory(0, &ehdr, sizeof(ehdr)); 1027 1028 Elf32_Shdr shdr; 1029 memset(&shdr, 0, sizeof(shdr)); 1030 shdr.sh_type = SHT_NULL; 1031 memory_.SetMemory(sh_offset, &shdr, sizeof(shdr)); 1032 1033 sh_offset += sizeof(shdr); 1034 memset(&shdr, 0, sizeof(shdr)); 1035 shdr.sh_type = SHT_STRTAB; 1036 shdr.sh_name = 1; 1037 shdr.sh_offset = 0x500; 1038 shdr.sh_size = 0x100; 1039 memory_.SetMemory(sh_offset, &shdr, sizeof(shdr)); 1040 memory_.SetMemory(0x500, ".debug_frame"); 1041 1042 sh_offset += sizeof(shdr); 1043 memset(&shdr, 0, sizeof(shdr)); 1044 shdr.sh_type = SHT_PROGBITS; 1045 shdr.sh_name = 0; 1046 shdr.sh_addr = 0x600; 1047 shdr.sh_offset = 0x600; 1048 shdr.sh_size = 0x200; 1049 memory_.SetMemory(sh_offset, &shdr, sizeof(shdr)); 1050 1051 // CIE 32. 1052 memory_.SetData32(0x600, 0xfc); 1053 memory_.SetData32(0x604, 0xffffffff); 1054 memory_.SetData8(0x608, 1); 1055 memory_.SetData8(0x609, '\0'); 1056 memory_.SetData8(0x60a, 0x4); 1057 memory_.SetData8(0x60b, 0x4); 1058 memory_.SetData8(0x60c, 0x1); 1059 1060 // FDE 32. 1061 memory_.SetData32(0x700, 0xfc); 1062 memory_.SetData32(0x704, 0); 1063 memory_.SetData32(0x708, 0x2100); 1064 memory_.SetData32(0x70c, 0x200); 1065 1066 uint64_t load_bias = 0; 1067 ASSERT_TRUE(elf->Init(&load_bias)); 1068 elf->InitHeaders(); 1069 EXPECT_EQ(0U, load_bias); 1070 EXPECT_FALSE(elf->IsValidPc(0)); 1071 EXPECT_FALSE(elf->IsValidPc(0x20ff)); 1072 EXPECT_TRUE(elf->IsValidPc(0x2100)); 1073 EXPECT_TRUE(elf->IsValidPc(0x2200)); 1074 EXPECT_TRUE(elf->IsValidPc(0x22ff)); 1075 EXPECT_FALSE(elf->IsValidPc(0x2300)); 1076 } 1077 1078 TEST_F(ElfInterfaceTest, is_valid_pc_from_eh_frame) { 1079 std::unique_ptr<ElfInterface> elf(new ElfInterface32(&memory_)); 1080 1081 uint64_t sh_offset = 0x100; 1082 1083 Elf32_Ehdr ehdr; 1084 memset(&ehdr, 0, sizeof(ehdr)); 1085 ehdr.e_shstrndx = 1; 1086 ehdr.e_shoff = sh_offset; 1087 ehdr.e_shentsize = sizeof(Elf32_Shdr); 1088 ehdr.e_shnum = 3; 1089 memory_.SetMemory(0, &ehdr, sizeof(ehdr)); 1090 1091 Elf32_Shdr shdr; 1092 memset(&shdr, 0, sizeof(shdr)); 1093 shdr.sh_type = SHT_NULL; 1094 memory_.SetMemory(sh_offset, &shdr, sizeof(shdr)); 1095 1096 sh_offset += sizeof(shdr); 1097 memset(&shdr, 0, sizeof(shdr)); 1098 shdr.sh_type = SHT_STRTAB; 1099 shdr.sh_name = 1; 1100 shdr.sh_offset = 0x500; 1101 shdr.sh_size = 0x100; 1102 memory_.SetMemory(sh_offset, &shdr, sizeof(shdr)); 1103 memory_.SetMemory(0x500, ".eh_frame"); 1104 1105 sh_offset += sizeof(shdr); 1106 memset(&shdr, 0, sizeof(shdr)); 1107 shdr.sh_type = SHT_PROGBITS; 1108 shdr.sh_name = 0; 1109 shdr.sh_addr = 0x600; 1110 shdr.sh_offset = 0x600; 1111 shdr.sh_size = 0x200; 1112 memory_.SetMemory(sh_offset, &shdr, sizeof(shdr)); 1113 1114 // CIE 32. 1115 memory_.SetData32(0x600, 0xfc); 1116 memory_.SetData32(0x604, 0); 1117 memory_.SetData8(0x608, 1); 1118 memory_.SetData8(0x609, '\0'); 1119 memory_.SetData8(0x60a, 0x4); 1120 memory_.SetData8(0x60b, 0x4); 1121 memory_.SetData8(0x60c, 0x1); 1122 1123 // FDE 32. 1124 memory_.SetData32(0x700, 0xfc); 1125 memory_.SetData32(0x704, 0x104); 1126 memory_.SetData32(0x708, 0x20f8); 1127 memory_.SetData32(0x70c, 0x200); 1128 1129 uint64_t load_bias = 0; 1130 ASSERT_TRUE(elf->Init(&load_bias)); 1131 elf->InitHeaders(); 1132 EXPECT_EQ(0U, load_bias); 1133 EXPECT_FALSE(elf->IsValidPc(0)); 1134 EXPECT_FALSE(elf->IsValidPc(0x27ff)); 1135 EXPECT_TRUE(elf->IsValidPc(0x2800)); 1136 EXPECT_TRUE(elf->IsValidPc(0x2900)); 1137 EXPECT_TRUE(elf->IsValidPc(0x29ff)); 1138 EXPECT_FALSE(elf->IsValidPc(0x2a00)); 1139 } 1140 1141 } // namespace unwindstack 1142