[lld] r361213 - [ELF] Error on relocations to local undefined symbols

Fangrui Song via llvm-commits llvm-commits at lists.llvm.org
Mon May 20 19:38:11 PDT 2019


Author: maskray
Date: Mon May 20 19:38:11 2019
New Revision: 361213

URL: http://llvm.org/viewvc/llvm-project?rev=361213&view=rev
Log:
[ELF] Error on relocations to local undefined symbols

For a reference to a local symbol, ld.bfd and gold error if the symbol
is defined in a discarded section but accept it if the symbol is
undefined. This inconsistent behavior seems unnecessary for us (it
probably makes sense for them as they differentiate local/global
symbols, the error would mean more code).

Catch such errors. Symbol index 0 may be used by marker relocations,
e.g. R_*_NONE R_ARM_V4BX. Don't error on them.

The difference from D61563 (which caused msan failure) is we don't call
Sym.computeBinding() on local symbols - VersionId is uninitialized.

Modified:
    lld/trunk/ELF/Relocations.cpp
    lld/trunk/test/ELF/local-undefined-symbol.s

Modified: lld/trunk/ELF/Relocations.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Relocations.cpp?rev=361213&r1=361212&r2=361213&view=diff
==============================================================================
--- lld/trunk/ELF/Relocations.cpp (original)
+++ lld/trunk/ELF/Relocations.cpp Mon May 20 19:38:11 2019
@@ -675,11 +675,11 @@ static int64_t computeAddend(const RelTy
 // 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;
 
@@ -1012,7 +1012,8 @@ template <class ELFT, class RelTy>
 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.
@@ -1028,8 +1029,9 @@ static void scanReloc(InputSectionBase &
   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;

Modified: lld/trunk/test/ELF/local-undefined-symbol.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/local-undefined-symbol.s?rev=361213&r1=361212&r2=361213&view=diff
==============================================================================
--- lld/trunk/test/ELF/local-undefined-symbol.s (original)
+++ lld/trunk/test/ELF/local-undefined-symbol.s Mon May 20 19:38:11 2019
@@ -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:




More information about the llvm-commits mailing list