Index: lld/COFF/Chunks.cpp =================================================================== --- lld/COFF/Chunks.cpp +++ lld/COFF/Chunks.cpp @@ -252,20 +252,27 @@ // Get the output section of the symbol for this relocation. The output // section is needed to compute SECREL and SECTION relocations used in debug // info. - Defined *Sym = cast(File->getSymbol(Rel.SymbolTableIndex)); - Chunk *C = Sym->getChunk(); - OutputSection *OS = C ? C->getOutputSection() : nullptr; + auto *Sym = + dyn_cast_or_null(File->getSymbol(Rel.SymbolTableIndex)); + OutputSection *OS = nullptr; + if (Sym) + if (Chunk *C = Sym->getChunk()) + OS = C->getOutputSection(); // Only absolute and __ImageBase symbols lack an output section. For any // other symbol, this indicates that the chunk was discarded. Normally // relocations against discarded sections are an error. However, debug info // sections are not GC roots and can end up with these kinds of relocations. // Skip these relocations. - if (!OS && !isa(Sym) && !isa(Sym)) { + if (!OS && + (!Sym || (!isa(Sym) && !isa(Sym)))) { if (isCodeView() || isDWARF()) continue; - fatal("relocation against symbol in discarded section: " + - Sym->getName()); + COFFSymbolRef Sym = + check(File->getCOFFObj()->getSymbol(Rel.SymbolTableIndex)); + StringRef Name; + File->getCOFFObj()->getSymbolName(Sym, Name); + fatal("relocation against symbol in discarded section: " + Name); } uint64_t S = Sym->getRVA(); @@ -328,7 +335,8 @@ uint8_t Ty = getBaserelType(Rel); if (Ty == IMAGE_REL_BASED_ABSOLUTE) continue; - if (isa(File->getSymbol(Rel.SymbolTableIndex))) + Symbol *Target = File->getSymbol(Rel.SymbolTableIndex); + if (!Target || isa(Target)) continue; Res->emplace_back(RVA + Rel.VirtualAddress, Ty); } Index: lld/COFF/MarkLive.cpp =================================================================== --- lld/COFF/MarkLive.cpp +++ lld/COFF/MarkLive.cpp @@ -63,7 +63,8 @@ // Mark all symbols listed in the relocation table for this section. for (Symbol *B : SC->symbols()) - AddSym(B); + if (B) + AddSym(B); // Mark associative sections if any. for (SectionChunk *C : SC->children()) Index: lld/test/COFF/reloc-discarded-early.s =================================================================== --- /dev/null +++ lld/test/COFF/reloc-discarded-early.s @@ -0,0 +1,8 @@ +# RUN: llvm-mc -triple=x86_64-windows-msvc -filetype=obj -o %t.obj %s +# RUN: lld-link -entry:__ImageBase -subsystem:console -debug %t.obj + +.section .debug_info,"dr" +.quad .Ldrectve + +.section .drectve +.Ldrectve: Index: lld/test/COFF/reloc-discarded-early2.s =================================================================== --- /dev/null +++ lld/test/COFF/reloc-discarded-early2.s @@ -0,0 +1,9 @@ +# RUN: llvm-mc -triple=x86_64-windows-msvc -filetype=obj -o %t.obj %s +# RUN: not lld-link -entry:__ImageBase -subsystem:console %t.obj 2>&1 | FileCheck %s + +.text +# CHECK: error: relocation against symbol in discarded section: .drectve +.quad .Ldrectve + +.section .drectve +.Ldrectve: