// Find the containing map info for the PC.
const MapEntry* MapData::find(uintptr_t pc, uintptr_t* rel_pc) {
  for (auto* entry : entries_) {
    if ((pc >= entry->start) && (pc < entry->end)) {
      if (!entry->load_base_read) {
        read_loadbase(entry);
      }
      if (rel_pc) {
        *rel_pc = pc - entry->start + entry->load_base;
      }
      return entry;
    }
  }
  if (rel_pc) {
    *rel_pc = pc;
  }
  return nullptr;
}
// Find the containing map info for the PC.
const MapEntry* MapData::find(uintptr_t pc, uintptr_t* rel_pc) {
  MapEntry pc_entry(pc);

  std::lock_guard<std::mutex> lock(m_);

  auto it = entries_.find(&pc_entry);
  if (it == entries_.end()) {
    ReadMaps();
  }
  it = entries_.find(&pc_entry);
  if (it == entries_.end()) {
    return nullptr;
  }

  MapEntry *entry = *it;
  if (!entry->load_base_read) {
    read_loadbase(entry);
  }
  if (rel_pc) {
    *rel_pc = pc - entry->start + entry->load_base;
  }
  return entry;
}