| 541 | } |
| 542 | |
| 543 | int ExpectFindModule(dl_phdr_info* info, size_t size, void* data) { |
| 544 | SCOPED_TRACE( |
| 545 | base::StringPrintf("module %s at 0x%" PRIx64 " phdrs 0x%" PRIx64, |
| 546 | info->dlpi_name, |
| 547 | LinuxVMAddress{info->dlpi_addr}, |
| 548 | FromPointerCast<LinuxVMAddress>(info->dlpi_phdr))); |
| 549 | auto modules = |
| 550 | reinterpret_cast<const std::vector<ProcessReaderLinux::Module>*>(data); |
| 551 | |
| 552 | #if BUILDFLAG(IS_ANDROID) |
| 553 | // Prior to API 27, Bionic includes a null entry for /system/bin/linker. |
| 554 | if (!info->dlpi_name) { |
| 555 | EXPECT_EQ(info->dlpi_addr, 0u); |
| 556 | EXPECT_EQ(info->dlpi_phnum, 0u); |
| 557 | EXPECT_EQ(info->dlpi_phdr, nullptr); |
| 558 | return 0; |
| 559 | } |
| 560 | #endif |
| 561 | |
| 562 | // Bionic doesn't always set both of these addresses for the vdso and |
| 563 | // /system/bin/linker, but it does always set one of them. |
| 564 | VMAddress module_addr = info->dlpi_phdr |
| 565 | ? FromPointerCast<LinuxVMAddress>(info->dlpi_phdr) |
| 566 | : info->dlpi_addr; |
| 567 | |
| 568 | // TODO(jperaza): This can use a range map when one is available. |
| 569 | bool found = false; |
| 570 | for (const auto& module : *modules) { |
| 571 | if (module.elf_reader && module_addr >= module.elf_reader->Address() && |
| 572 | module_addr < |
| 573 | module.elf_reader->Address() + module.elf_reader->Size()) { |
| 574 | found = true; |
| 575 | break; |
| 576 | } |
| 577 | } |
| 578 | EXPECT_TRUE(found); |
| 579 | return 0; |
| 580 | } |
| 581 | |
| 582 | void ExpectModulesFromSelf( |
| 583 | const std::vector<ProcessReaderLinux::Module>& modules) { |