Index: lld/COFF/InputFiles.cpp =================================================================== --- lld/COFF/InputFiles.cpp +++ lld/COFF/InputFiles.cpp @@ -300,18 +300,22 @@ Optional ObjFile::createDefined( COFFSymbolRef Sym, std::vector &ComdatDefs) { - StringRef Name; + auto GetName = [&]() { + StringRef S; + COFFObj->getSymbolName(Sym, S); + return S; + }; + if (Sym.isCommon()) { auto *C = make(Sym); Chunks.push_back(C); - COFFObj->getSymbolName(Sym, Name); Symbol *S = - Symtab->addCommon(this, Name, Sym.getValue(), Sym.getGeneric(), C); + Symtab->addCommon(this, GetName(), Sym.getValue(), Sym.getGeneric(), C); return S; } if (Sym.isAbsolute()) { - COFFObj->getSymbolName(Sym, Name); + StringRef Name = GetName(); // Skip special symbols. if (Name == "@comp.id") return nullptr; @@ -329,11 +333,11 @@ return nullptr; if (llvm::COFF::isReservedSectionNumber(SectionNumber)) - fatal(toString(this) + ": " + Name + + fatal(toString(this) + ": " + GetName() + " should not refer to special section " + Twine(SectionNumber)); if ((uint32_t)SectionNumber >= SparseChunks.size()) - fatal(toString(this) + ": " + Name + + fatal(toString(this) + ": " + GetName() + " should not refer to non-existent section " + Twine(SectionNumber)); // Handle comdat leader symbols. @@ -342,16 +346,16 @@ Symbol *Leader; bool Prevailing; if (Sym.isExternal()) { - COFFObj->getSymbolName(Sym, Name); std::tie(Leader, Prevailing) = - Symtab->addComdat(this, Name, Sym.getGeneric()); + Symtab->addComdat(this, GetName(), Sym.getGeneric()); } else { Leader = make(this, /*Name*/ "", false, /*IsExternal*/ false, Sym.getGeneric()); Prevailing = true; } + if (Prevailing) { - SectionChunk *C = readSection(SectionNumber, Def, Name); + SectionChunk *C = readSection(SectionNumber, Def, GetName()); SparseChunks[SectionNumber] = C; C->Sym = cast(Leader); cast(Leader)->Data = &C->Repl; Index: lld/test/COFF/invalid-section-number.test =================================================================== --- /dev/null +++ lld/test/COFF/invalid-section-number.test @@ -0,0 +1,34 @@ +# RUN: yaml2obj %s > %t.obj +# RUN: not lld-link %t.obj 2>&1 | FileCheck %s + +# CHECK: foo should not refer to special section -10 + +--- !COFF +header: + Machine: IMAGE_FILE_MACHINE_I386 + Characteristics: [] +sections: + - Name: .text + Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ] + Alignment: 4 + SectionData: B82A000000C3 +symbols: + - Name: .text + Value: 0 + SectionNumber: 1 + SimpleType: IMAGE_SYM_TYPE_NULL + ComplexType: IMAGE_SYM_DTYPE_NULL + StorageClass: IMAGE_SYM_CLASS_STATIC + SectionDefinition: + Length: 6 + NumberOfRelocations: 0 + NumberOfLinenumbers: 0 + CheckSum: 0 + Number: 0 + - Name: foo + Value: 0 + SectionNumber: -10 + SimpleType: IMAGE_SYM_TYPE_NULL + ComplexType: IMAGE_SYM_DTYPE_NULL + StorageClass: IMAGE_SYM_CLASS_EXTERNAL +...