| 455 | } |
| 456 | |
| 457 | CorefileRemoteMemoryManager::StatusCode |
| 458 | CorefileRemoteMemoryManager::initLoadSegments(const std::string& filename) const |
| 459 | { |
| 460 | file_unique_ptr file(fopen(filename.c_str(), "r"), fclose); |
| 461 | if (!file || fileno(file.get()) == -1) { |
| 462 | return StatusCode::ERROR; |
| 463 | } |
| 464 | |
| 465 | auto elf = elf_unique_ptr(elf_begin(fileno(file.get()), ELF_C_READ_MMAP, nullptr), elf_end); |
| 466 | if (!elf) { |
| 467 | return StatusCode::ERROR; |
| 468 | } |
| 469 | |
| 470 | std::vector<ElfLoadSegment> segments; |
| 471 | size_t phnum; |
| 472 | if (elf_getphdrnum(elf.get(), &phnum) == 0) { |
| 473 | for (size_t i = 0; i < phnum; i++) { |
| 474 | GElf_Phdr phdr_mem; |
| 475 | GElf_Phdr* phdr = gelf_getphdr(elf.get(), i, &phdr_mem); |
| 476 | if (phdr == nullptr) { |
| 477 | LOG(WARNING) << "Failed to read program header " << i << " from " << filename.c_str() |
| 478 | << " (" << elf_errmsg(elf_errno()) << ")"; |
| 479 | continue; |
| 480 | } |
| 481 | |
| 482 | if (phdr->p_type == PT_LOAD) { |
| 483 | segments.push_back( |
| 484 | {.vaddr = phdr->p_vaddr, .offset = phdr->p_offset, .size = phdr->p_filesz}); |
| 485 | } |
| 486 | } |
| 487 | } |
| 488 | |
| 489 | if (!segments.empty()) { |
| 490 | d_elf_load_segments_cache[filename] = std::move(segments); |
| 491 | return StatusCode::SUCCESS; |
| 492 | } |
| 493 | return StatusCode::ERROR; |
| 494 | } |
| 495 | |
| 496 | CorefileRemoteMemoryManager::StatusCode |
| 497 | CorefileRemoteMemoryManager::getMemoryLocationFromElf( |