diff options
Diffstat (limited to 'llvm/lib/ObjectYAML/COFFEmitter.cpp')
-rw-r--r-- | llvm/lib/ObjectYAML/COFFEmitter.cpp | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/llvm/lib/ObjectYAML/COFFEmitter.cpp b/llvm/lib/ObjectYAML/COFFEmitter.cpp index efcdc51e1670..ec3ec55011f9 100644 --- a/llvm/lib/ObjectYAML/COFFEmitter.cpp +++ b/llvm/lib/ObjectYAML/COFFEmitter.cpp @@ -260,9 +260,12 @@ static bool layoutCOFF(COFFParser &CP) { CurrentSectionDataOffset += S.Header.SizeOfRawData; if (!S.Relocations.empty()) { S.Header.PointerToRelocations = CurrentSectionDataOffset; - S.Header.NumberOfRelocations = S.Relocations.size(); - CurrentSectionDataOffset += - S.Header.NumberOfRelocations * COFF::RelocationSize; + if (S.Header.Characteristics & COFF::IMAGE_SCN_LNK_NRELOC_OVFL) { + S.Header.NumberOfRelocations = 0xffff; + CurrentSectionDataOffset += COFF::RelocationSize; + } else + S.Header.NumberOfRelocations = S.Relocations.size(); + CurrentSectionDataOffset += S.Relocations.size() * COFF::RelocationSize; } } else { // Leave SizeOfRawData unaltered. For .bss sections in object files, it @@ -506,6 +509,10 @@ static bool writeCOFF(COFFParser &CP, raw_ostream &OS) { S.SectionData.writeAsBinary(OS); assert(S.Header.SizeOfRawData >= S.SectionData.binary_size()); OS.write_zeros(S.Header.SizeOfRawData - S.SectionData.binary_size()); + if (S.Header.Characteristics & COFF::IMAGE_SCN_LNK_NRELOC_OVFL) + OS << binary_le<uint32_t>(/*VirtualAddress=*/ S.Relocations.size() + 1) + << binary_le<uint32_t>(/*SymbolTableIndex=*/ 0) + << binary_le<uint16_t>(/*Type=*/ 0); for (const COFFYAML::Relocation &R : S.Relocations) { uint32_t SymbolTableIndex; if (R.SymbolTableIndex) { |