@@ -73,7 +73,7 @@ Error COFFReader::readSections(Object &Obj) const {
7373 return errorCodeToError (EC);
7474 ArrayRef<coff_relocation> Relocs = COFFObj.getRelocations (Sec);
7575 for (const coff_relocation &R : Relocs)
76- S.Relocs .push_back (R );
76+ S.Relocs .push_back (Relocation{R} );
7777 if (auto EC = COFFObj.getSectionName (Sec, S.Name ))
7878 return errorCodeToError (EC);
7979 if (Sec->hasExtendedRelocations ())
@@ -84,14 +84,16 @@ Error COFFReader::readSections(Object &Obj) const {
8484}
8585
8686Error COFFReader::readSymbols (Object &Obj, bool IsBigObj) const {
87+ std::vector<Symbol> Symbols;
88+ Symbols.reserve (COFFObj.getRawNumberOfSymbols ());
8789 for (uint32_t I = 0 , E = COFFObj.getRawNumberOfSymbols (); I < E;) {
8890 Expected<COFFSymbolRef> SymOrErr = COFFObj.getSymbol (I);
8991 if (!SymOrErr)
9092 return SymOrErr.takeError ();
9193 COFFSymbolRef SymRef = *SymOrErr;
9294
93- Obj. Symbols .push_back (Symbol ());
94- Symbol &Sym = Obj. Symbols .back ();
95+ Symbols.push_back (Symbol ());
96+ Symbol &Sym = Symbols.back ();
9597 // Copy symbols from the original form into an intermediate coff_symbol32.
9698 if (IsBigObj)
9799 copySymbol (Sym.Sym ,
@@ -106,6 +108,30 @@ Error COFFReader::readSymbols(Object &Obj, bool IsBigObj) const {
106108 (IsBigObj ? sizeof (coff_symbol32) : sizeof (coff_symbol16))) == 0 );
107109 I += 1 + SymRef.getNumberOfAuxSymbols ();
108110 }
111+ Obj.addSymbols (Symbols);
112+ return Error::success ();
113+ }
114+
115+ Error COFFReader::setRelocTargets (Object &Obj) const {
116+ std::vector<const Symbol *> RawSymbolTable;
117+ for (const Symbol &Sym : Obj.getSymbols ()) {
118+ RawSymbolTable.push_back (&Sym);
119+ for (size_t I = 0 ; I < Sym.Sym .NumberOfAuxSymbols ; I++)
120+ RawSymbolTable.push_back (nullptr );
121+ }
122+ for (Section &Sec : Obj.Sections ) {
123+ for (Relocation &R : Sec.Relocs ) {
124+ if (R.Reloc .SymbolTableIndex >= RawSymbolTable.size ())
125+ return make_error<StringError>(" SymbolTableIndex out of range" ,
126+ object_error::parse_failed);
127+ const Symbol *Sym = RawSymbolTable[R.Reloc .SymbolTableIndex ];
128+ if (Sym == nullptr )
129+ return make_error<StringError>(" Invalid SymbolTableIndex" ,
130+ object_error::parse_failed);
131+ R.Target = Sym->UniqueId ;
132+ R.TargetName = Sym->Name ;
133+ }
134+ }
109135 return Error::success ();
110136}
111137
@@ -136,6 +162,8 @@ Expected<std::unique_ptr<Object>> COFFReader::create() const {
136162 return std::move (E);
137163 if (Error E = readSymbols (*Obj, IsBigObj))
138164 return std::move (E);
165+ if (Error E = setRelocTargets (*Obj))
166+ return std::move (E);
139167
140168 return std::move (Obj);
141169}
0 commit comments