From: Dmitri Gribenko Date: Mon, 20 May 2019 15:04:08 +0000 (+0000) Subject: Revert "[ELF] Error on relocations to local undefined symbols" X-Git-Tag: llvmorg-9.0.0-rc1~5163 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=0429fddc9d8c29cc467635f9b469b492d80a19ab;p=platform%2Fupstream%2Fllvm.git 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. llvm-svn: 361162 --- diff --git a/lld/ELF/Relocations.cpp b/lld/ELF/Relocations.cpp index fbdeb4f346b7..74b46174dbf4 100644 --- a/lld/ELF/Relocations.cpp +++ b/lld/ELF/Relocations.cpp @@ -675,7 +675,7 @@ static int64_t computeAddend(const RelTy &Rel, const RelTy *End, // 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 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()->getSymbol(SymIndex); + Symbol &Sym = Sec.getFile()->getRelocTargetSym(Rel); RelType Type; // Deal with MIPS oddity. @@ -1029,9 +1028,8 @@ static void scanReloc(InputSectionBase &Sec, OffsetGetter &GetOffset, RelTy *&I, 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; diff --git a/lld/test/ELF/local-undefined-symbol.s b/lld/test/ELF/local-undefined-symbol.s index c2ab207359bf..bff8c8bc1dc3 100644 --- a/lld/test/ELF/local-undefined-symbol.s +++ b/lld/test/ELF/local-undefined-symbol.s @@ -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: