17 Error XCOFFReader::readSections(Object &Obj)
const {
18 ArrayRef<XCOFFSectionHeader32> Sections = XCOFFObj.sections32();
19 for (
const XCOFFSectionHeader32 &Sec : Sections) {
22 ReadSec.SectionHeader = Sec;
23 DataRefImpl SectionDRI;
24 SectionDRI.p =
reinterpret_cast<uintptr_t
>(&Sec);
27 if (Sec.SectionSize) {
28 Expected<ArrayRef<uint8_t>> ContentsRef =
29 XCOFFObj.getSectionContents(SectionDRI);
31 return ContentsRef.takeError();
32 ReadSec.Contents = ContentsRef.get();
36 if (Sec.NumberOfRelocations) {
38 XCOFFObj.relocations<XCOFFSectionHeader32, XCOFFRelocation32>(Sec);
40 return Relocations.takeError();
41 for (
const XCOFFRelocation32 &Rel : Relocations.get())
42 ReadSec.Relocations.push_back(Rel);
45 Obj.Sections.push_back(
std::move(ReadSec));
50 Error XCOFFReader::readSymbols(Object &Obj)
const {
51 std::vector<Symbol> Symbols;
52 Symbols.reserve(XCOFFObj.getNumberOfSymbolTableEntries());
53 for (SymbolRef Sym : XCOFFObj.symbols()) {
55 DataRefImpl SymbolDRI = Sym.getRawDataRefImpl();
56 XCOFFSymbolRef SymbolEntRef = XCOFFObj.toSymbolRef(SymbolDRI);
57 ReadSym.Sym = *SymbolEntRef.getSymbol32();
59 if (SymbolEntRef.getNumberOfAuxEntries()) {
60 const char *Start =
reinterpret_cast<const char *
>(
62 Expected<StringRef> RawAuxEntriesOrError = XCOFFObj.getRawData(
66 if (!RawAuxEntriesOrError)
67 return RawAuxEntriesOrError.takeError();
68 ReadSym.AuxSymbolEntries = RawAuxEntriesOrError.get();
70 Obj.Symbols.push_back(
std::move(ReadSym));
76 auto Obj = std::make_unique<Object>();
78 if (XCOFFObj.is64Bit())
80 "64-bit XCOFF is not supported yet");
82 Obj->FileHeader = *XCOFFObj.fileHeader32();
84 if (XCOFFObj.getOptionalHeaderSize())
85 Obj->OptionalFileHeader = *XCOFFObj.auxiliaryHeader32();
87 Obj->Sections.reserve(XCOFFObj.getNumberOfSections());
88 if (
Error E = readSections(*Obj))
91 Obj->Symbols.reserve(XCOFFObj.getRawNumberOfSymbolTableEntries32());
92 if (
Error E = readSymbols(*Obj))
95 Obj->StringTable = XCOFFObj.getStringTable();