void MachOObjectFile::getSection(DataRefImpl DRI, InMemoryStruct<macho::Section> &Res) const { InMemoryStruct<macho::SegmentLoadCommand> SLC; LoadCommandInfo LCI = MachOObj->getLoadCommandInfo(DRI.d.a); MachOObj->ReadSegmentLoadCommand(LCI, SLC); MachOObj->ReadSection(LCI, DRI.d.b, Res); }
StringRef MachOObjectFile::getSectionName(DataRefImpl DRI) const { InMemoryStruct<macho::SegmentLoadCommand> SLC; LoadCommandInfo LCI = MachOObj->getLoadCommandInfo(DRI.d.a); MachOObj->ReadSegmentLoadCommand(LCI, SLC); InMemoryStruct<macho::Section> Sect; MachOObj->ReadSection(LCI, DRI.d.b, Sect); static char Result[34]; strcpy(Result, SLC->Name); strcat(Result, ","); strcat(Result, Sect->Name); return StringRef(Result); }
void MachOObjectFile::moveToNextSection(DataRefImpl &DRI) const { uint32_t LoadCommandCount = MachOObj->getHeader().NumLoadCommands; while (DRI.d.a < LoadCommandCount) { LoadCommandInfo LCI = MachOObj->getLoadCommandInfo(DRI.d.a); if (LCI.Command.Type == macho::LCT_Segment) { InMemoryStruct<macho::SegmentLoadCommand> SegmentLoadCmd; MachOObj->ReadSegmentLoadCommand(LCI, SegmentLoadCmd); if (DRI.d.b < SegmentLoadCmd->NumSections) return; } else if (LCI.Command.Type == macho::LCT_Segment64) { InMemoryStruct<macho::Segment64LoadCommand> Segment64LoadCmd; MachOObj->ReadSegment64LoadCommand(LCI, Segment64LoadCmd); if (DRI.d.b < Segment64LoadCmd->NumSections) return; } DRI.d.a++; DRI.d.b = 0; } }
bool MachOObjectFile::isSectionText(DataRefImpl DRI) const { InMemoryStruct<macho::SegmentLoadCommand> SLC; LoadCommandInfo LCI = MachOObj->getLoadCommandInfo(DRI.d.a); MachOObj->ReadSegmentLoadCommand(LCI, SLC); return !strcmp(SLC->Name, "__TEXT"); }