// 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 =
- Sym.computeBinding() != STB_LOCAL && Sym.Visibility == STV_DEFAULT;
+ bool CanBeExternal = !Sym.isLocal() && Sym.computeBinding() != STB_LOCAL &&
+ Sym.Visibility == STV_DEFAULT;
if (Config->UnresolvedSymbols == UnresolvedPolicy::Ignore && CanBeExternal)
return false;
static void scanReloc(InputSectionBase &Sec, OffsetGetter &GetOffset, RelTy *&I,
RelTy *End) {
const RelTy &Rel = *I;
- Symbol &Sym = Sec.getFile<ELFT>()->getRelocTargetSym(Rel);
+ uint32_t SymIndex = Rel.getSymbol(Config->IsMips64EL);
+ Symbol &Sym = Sec.getFile<ELFT>()->getSymbol(SymIndex);
RelType Type;
// Deal with MIPS oddity.
if (Offset == uint64_t(-1))
return;
- // Skip if the target symbol is an erroneous undefined symbol.
- if (maybeReportUndefined(Sym, Sec, Rel.r_offset))
+ // Error if the target symbol is undefined. Symbol index 0 may be used by
+ // marker relocations, e.g. R_*_NONE and R_ARM_V4BX. 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;
# 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: