forked from OSchip/llvm-project
Don't crash if reloc targets discarded section
Differential revision: https://reviews.llvm.org/D25433 llvm-svn: 283984
This commit is contained in:
parent
411e1f8288
commit
c958d8d621
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue