MCPcopy Create free account
hub / github.com/bloomberg/pystack / initLoadSegments

Method initLoadSegments

src/pystack/_pystack/mem.cpp:457–494  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

455}
456
457CorefileRemoteMemoryManager::StatusCode
458CorefileRemoteMemoryManager::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
496CorefileRemoteMemoryManager::StatusCode
497CorefileRemoteMemoryManager::getMemoryLocationFromElf(

Callers

nothing calls this directly

Calls 1

LOGClass · 0.85

Tested by

no test coverage detected