Index: ELF/Relocations.cpp =================================================================== --- ELF/Relocations.cpp +++ ELF/Relocations.cpp @@ -673,7 +673,7 @@ // Returns true if this function printed out an error message. static bool maybeReportUndefined(Symbol &Sym, InputSectionBase &Sec, uint64_t Offset) { - if (Sym.isLocal() || !Sym.isUndefined() || Sym.isWeak()) + if (!Sym.isUndefined() || Sym.isWeak()) return false; bool CanBeExternal = @@ -1010,7 +1010,8 @@ static void scanReloc(InputSectionBase &Sec, OffsetGetter &GetOffset, RelTy *&I, RelTy *End) { const RelTy &Rel = *I; - Symbol &Sym = Sec.getFile()->getRelocTargetSym(Rel); + uint32_t SymIndex = Rel.getSymbol(Config->IsMips64EL); + Symbol &Sym = Sec.getFile()->getSymbol(SymIndex); RelType Type; // Deal with MIPS oddity. @@ -1026,8 +1027,9 @@ if (Offset == uint64_t(-1)) return; - // Skip if the target symbol is an erroneous undefined symbol. - if (maybeReportUndefined(Sym, Sec, Rel.r_offset)) + // Skip if the target symbol is an erroneous undefined symbol. SymIndex 0 may + // be used by R_*_NONE. Don't error on them. + if (SymIndex != 0 && maybeReportUndefined(Sym, Sec, Rel.r_offset)) return; const uint8_t *RelocatedAddr = Sec.data().begin() + Rel.r_offset; Index: test/ELF/local-undefined-symbol.s =================================================================== --- test/ELF/local-undefined-symbol.s +++ test/ELF/local-undefined-symbol.s @@ -1,10 +1,8 @@ # REQUIRES: x86 -# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t -# RUN: ld.lld %t -o %t1 -# RUN: llvm-readobj --symbols %t1 | FileCheck %s +# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o +# RUN: not ld.lld %t.o -o %t 2>&1 | FileCheck %s -# CHECK: Symbols [ -# CHECK-NOT: Name: foo +# CHECK: error: undefined symbol: foo .global _start _start: