Index: lld/trunk/ELF/Symbols.cpp =================================================================== --- lld/trunk/ELF/Symbols.cpp +++ lld/trunk/ELF/Symbols.cpp @@ -15,6 +15,7 @@ #include "Target.h" #include "llvm/ADT/STLExtras.h" +#include "llvm/Support/Path.h" using namespace llvm; using namespace llvm::object; @@ -24,6 +25,12 @@ using namespace lld::elf; template +static std::string getSectionName(InputSectionBase *S) { + StringRef Filename = S->getFile()->getName(); + return (sys::path::filename(Filename) + "(" + S->Name + ")").str(); +} + +template static typename ELFT::uint getSymVA(const SymbolBody &Body, typename ELFT::uint &Addend) { typedef typename ELFT::uint uintX_t; @@ -53,6 +60,11 @@ if (!SC) return D.Value; + if (!SC->Live) { + warn("relocation refers to discarded section '" + getSectionName(SC) + "'"); + return 0; + } + uintX_t Offset = D.Value; if (D.isSection()) { Offset += Addend; Index: lld/trunk/test/ELF/linkerscript/discard-section.s =================================================================== --- lld/trunk/test/ELF/linkerscript/discard-section.s +++ lld/trunk/test/ELF/linkerscript/discard-section.s @@ -1,10 +1,15 @@ # REQUIRES: x86 # RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t # RUN: echo "SECTIONS { /DISCARD/ : { *(.aaa*) } }" > %t.script -# RUN: ld.lld -o %t1 --script %t.script %t +# RUN: ld.lld -o %t1 --script %t.script %t 2>&1 | FileCheck --check-prefix=WARN %s # RUN: llvm-objdump -section-headers %t1 | FileCheck %s + +# WARN: relocation refers to discarded section {{.+}}(.aaa) # CHECK-NOT: .aaa .section .aaa,"a" -aaa: +aab: .quad 0 + +.section .zzz,"a" + .quad aab