[ELF] Fix error reporting for synthetic sections

Synthetic sections don't belong to any input file, but still they
are input sections. Whenever problem occurs with relocations in
these sections lld crashes in error reporting, trying to print
input file name.

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

llvm-svn: 297711
This commit is contained in:
Eugene Leviant 2017-03-14 08:33:45 +00:00
parent d614b3e6bd
commit 2968547997
2 changed files with 32 additions and 0 deletions

View File

@ -172,6 +172,11 @@ InputSectionBase *InputSectionBase::getLinkOrderDep() const {
// Returns a source location string. Used to construct an error message. // Returns a source location string. Used to construct an error message.
template <class ELFT> template <class ELFT>
std::string InputSectionBase::getLocation(uint64_t Offset) { std::string InputSectionBase::getLocation(uint64_t Offset) {
// We don't have file for synthetic sections.
if (getFile<ELFT>() == nullptr)
return (Config->OutputFile + ":(" + Name + "+0x" + utohexstr(Offset) + ")")
.str();
// First check if we can get desired values from debugging information. // First check if we can get desired values from debugging information.
std::string LineInfo = getFile<ELFT>()->getLineInfo(this, Offset); std::string LineInfo = getFile<ELFT>()->getLineInfo(this, Offset);
if (!LineInfo.empty()) if (!LineInfo.empty())

View File

@ -0,0 +1,27 @@
## Check that error is correctly reported when .eh_frame reloc
## is out of range
# REQUIRES: x86
# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o
# RUN: echo "PHDRS { eh PT_LOAD; text PT_LOAD; } \
# RUN: SECTIONS { . = 0x10000; \
# RUN: .eh_frame_hdr : { *(.eh_frame_hdr*) } : eh \
# RUN: .eh_frame : { *(.eh_frame) } : eh \
# RUN: . = 0xF00000000; \
# RUN: .text : { *(.text*) } : text \
# RUN: }" > %t.script
# RUN: not ld.lld %t.o -T %t.script -o %t 2>&1 | FileCheck %s
# CHECK: error: {{.*}}:(.eh_frame+0x20): relocation R_X86_64_PC32 out of range
.text
.globl _start
_start:
.cfi_startproc
.cfi_lsda 0, _ex
nop
.cfi_endproc
.data
_ex:
.word 0