[lld] r361162 - Revert "[ELF] Error on relocations to local undefined symbols"
Dmitri Gribenko via llvm-commits
llvm-commits at lists.llvm.org
Mon May 20 08:04:09 PDT 2019
Author: gribozavr
Date: Mon May 20 08:04:08 2019
New Revision: 361162
URL: http://llvm.org/viewvc/llvm-project?rev=361162&view=rev
Log:
Revert "[ELF] Error on relocations to local undefined symbols"
This reverts commit r361144. It causes a use-of-uninitialized-value in
maybeReportUndefined at llvm/tools/lld/ELF/Relocations.cpp:682, as
detected by MemorySanitizer when local-undefined-symbol.s test is run.
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=361162&r1=361161&r2=361162&view=diff
==============================================================================
--- lld/trunk/ELF/Relocations.cpp (original)
+++ lld/trunk/ELF/Relocations.cpp Mon May 20 08:04:08 2019
@@ -675,7 +675,7 @@ 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.isUndefined() || Sym.isWeak())
+ if (Sym.isLocal() || !Sym.isUndefined() || Sym.isWeak())
return false;
bool CanBeExternal =
@@ -1012,8 +1012,7 @@ template <class ELFT, class RelTy>
static void scanReloc(InputSectionBase &Sec, OffsetGetter &GetOffset, RelTy *&I,
RelTy *End) {
const RelTy &Rel = *I;
- uint32_t SymIndex = Rel.getSymbol(Config->IsMips64EL);
- Symbol &Sym = Sec.getFile<ELFT>()->getSymbol(SymIndex);
+ Symbol &Sym = Sec.getFile<ELFT>()->getRelocTargetSym(Rel);
RelType Type;
// Deal with MIPS oddity.
@@ -1029,9 +1028,8 @@ static void scanReloc(InputSectionBase &
if (Offset == uint64_t(-1))
return;
- // 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))
+ // Skip if the target symbol is an erroneous undefined symbol.
+ if (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=361162&r1=361161&r2=361162&view=diff
==============================================================================
--- lld/trunk/test/ELF/local-undefined-symbol.s (original)
+++ lld/trunk/test/ELF/local-undefined-symbol.s Mon May 20 08:04:08 2019
@@ -1,8 +1,10 @@
# REQUIRES: x86
-# 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
+# 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
-# CHECK: error: undefined symbol: foo
+# CHECK: Symbols [
+# CHECK-NOT: Name: foo
.global _start
_start:
More information about the llvm-commits
mailing list