void BinaryLoader::addSectionsForRemap(SgAsmGenericHeader* header, SgAsmGenericSectionPtrList &allSections) { allSections.insert(allSections.end(), header->get_sections()->get_sections().begin(), header->get_sections()->get_sections().end()); }
SgAsmGenericSectionPtrList SgAsmGenericFile::get_sections_by_va(rose_addr_t va) const { SgAsmGenericSectionPtrList retval; /* Holes (probably not mapped anyway) */ for (SgAsmGenericSectionPtrList::iterator i=p_holes->get_sections().begin(); i!=p_holes->get_sections().end(); ++i) { rose_addr_t rva = va; /* Holes don't belong to any header and therefore have a zero base_va */ if ((*i)->is_mapped() && rva >= (*i)->get_mapped_preferred_rva() && rva < (*i)->get_mapped_preferred_rva() + (*i)->get_mapped_size()) retval.push_back(*i); } /* Headers and their sections */ for (SgAsmGenericHeaderPtrList::iterator i=p_headers->get_headers().begin(); i!=p_headers->get_headers().end(); ++i) { /* Headers probably aren't mapped, but just in case... */ rose_addr_t rva = va; /* Headers don't belong to any header and therefore have a zero base_va */ if ((*i)->is_mapped() && rva >= (*i)->get_mapped_preferred_rva() && rva < (*i)->get_mapped_preferred_rva() + (*i)->get_mapped_size()) retval.push_back(*i); /* Header sections */ const SgAsmGenericSectionPtrList &recurse = (*i)->get_sections_by_va(va, true); retval.insert(retval.end(), recurse.begin(), recurse.end()); } return retval; }
SgAsmGenericSectionPtrList SgAsmGenericFile::get_sections(bool include_holes) const { SgAsmGenericSectionPtrList retval; /* Start with headers and holes */ retval.insert(retval.end(), p_headers->get_headers().begin(), p_headers->get_headers().end()); if (include_holes) retval.insert(retval.end(), p_holes->get_sections().begin(), p_holes->get_sections().end()); /* Add sections pointed to by headers. */ for (SgAsmGenericHeaderPtrList::iterator i=p_headers->get_headers().begin(); i!=p_headers->get_headers().end(); ++i) { if ((*i)->get_sections()!=NULL) { const SgAsmGenericSectionPtrList &recurse = (*i)->get_sections()->get_sections(); retval.insert(retval.end(), recurse.begin(), recurse.end()); } } return retval; }
SgAsmGenericSectionPtrList SgAsmGenericFile::get_sections_by_id(int id) const { SgAsmGenericSectionPtrList retval; /* Holes */ for (SgAsmGenericSectionPtrList::iterator i=p_holes->get_sections().begin(); i!=p_holes->get_sections().end(); ++i) { if ((*i)->get_id()==id) retval.push_back(*i); } /* Headers and their sections */ for (SgAsmGenericHeaderPtrList::iterator i=p_headers->get_headers().begin(); i!=p_headers->get_headers().end(); ++i) { if ((*i)->get_id()==id) retval.push_back(*i); const SgAsmGenericSectionPtrList &recurse = (*i)->get_sections_by_id(id); retval.insert(retval.end(), recurse.begin(), recurse.end()); } return retval; }
SgAsmGenericSectionPtrList SgAsmGenericFile::get_sections_by_name(std::string name, char sep/*or NUL*/) const { SgAsmGenericSectionPtrList retval; /* Truncate name */ if (sep) { size_t pos = name.find(sep); if (pos!=name.npos) name.erase(pos); } /* Holes */ for (SgAsmGenericSectionPtrList::iterator i=p_holes->get_sections().begin(); i!=p_holes->get_sections().end(); ++i) { std::string secname = (*i)->get_name()->get_string(); if (sep) { size_t pos = secname.find(sep); if (pos!=secname.npos) secname.erase(pos); } if (0==secname.compare(name)) retval.push_back(*i); } /* Headers and their sections */ for (SgAsmGenericHeaderPtrList::iterator i=p_headers->get_headers().begin(); i!=p_headers->get_headers().end(); ++i) { std::string secname = (*i)->get_name()->get_string(); if (sep) { size_t pos = secname.find(sep); if (pos!=secname.npos) secname.erase(pos); } if (0==secname.compare(name)) retval.push_back(*i); const SgAsmGenericSectionPtrList &recurse = (*i)->get_sections_by_name(name, sep); retval.insert(retval.end(), recurse.begin(), recurse.end()); } return retval; }
SgAsmGenericSectionPtrList SgAsmGenericFile::get_sections_by_rva(rose_addr_t rva) const { SgAsmGenericSectionPtrList retval; /* Holes (probably not mapped anyway) */ for (SgAsmGenericSectionPtrList::iterator i=p_holes->get_sections().begin(); i!=p_holes->get_sections().end(); ++i) { if ((*i)->is_mapped() && rva >= (*i)->get_mapped_preferred_rva() && rva < (*i)->get_mapped_preferred_rva() + (*i)->get_mapped_size()) retval.push_back(*i); } /* Headers and their sections */ for (SgAsmGenericHeaderPtrList::iterator i=p_headers->get_headers().begin(); i!=p_headers->get_headers().end(); ++i) { if ((*i)->is_mapped() && rva >= (*i)->get_mapped_preferred_rva() && rva < (*i)->get_mapped_preferred_rva() + (*i)->get_mapped_size()) retval.push_back(*i); const SgAsmGenericSectionPtrList &recurse = (*i)->get_sections_by_rva(rva); retval.insert(retval.end(), recurse.begin(), recurse.end()); } return retval; }
SgAsmGenericSectionPtrList SgAsmGenericFile::get_sections_by_offset(rose_addr_t offset, rose_addr_t size) const { SgAsmGenericSectionPtrList retval; /* Holes */ for (SgAsmGenericSectionPtrList::iterator i=p_holes->get_sections().begin(); i!=p_holes->get_sections().end(); ++i) { if (offset >= (*i)->get_offset() && offset < (*i)->get_offset()+(*i)->get_size() && offset-(*i)->get_offset() + size <= (*i)->get_size()) retval.push_back(*i); } /* Headers and their sections */ for (SgAsmGenericHeaderPtrList::iterator i=p_headers->get_headers().begin(); i!=p_headers->get_headers().end(); ++i) { if (offset >= (*i)->get_offset() && offset < (*i)->get_offset()+(*i)->get_size() && offset-(*i)->get_offset() + size <= (*i)->get_size()) retval.push_back(*i); const SgAsmGenericSectionPtrList &recurse = (*i)->get_sections_by_offset(offset, size); retval.insert(retval.end(), recurse.begin(), recurse.end()); } return retval; }