Don't crash if reloc targets discarded section

Differential revision: https://reviews.llvm.org/D25433

llvm-svn: 283984
This commit is contained in:
Eugene Leviant 2016-10-12 08:19:30 +00:00
parent 411e1f8288
commit c958d8d621
2 changed files with 19 additions and 2 deletions

View File

@ -15,6 +15,7 @@
#include "Target.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/Support/Path.h"
using namespace llvm;
using namespace llvm::object;
@ -23,6 +24,12 @@ using namespace llvm::ELF;
using namespace lld;
using namespace lld::elf;
template <class ELFT>
static std::string getSectionName(InputSectionBase<ELFT> *S) {
StringRef Filename = S->getFile()->getName();
return (sys::path::filename(Filename) + "(" + S->Name + ")").str();
}
template <class ELFT>
static typename ELFT::uint getSymVA(const SymbolBody &Body,
typename ELFT::uint &Addend) {
@ -53,6 +60,11 @@ static typename ELFT::uint getSymVA(const SymbolBody &Body,
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;

View File

@ -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