[ELF][RISCV] Error on R_RISCV_PCREL_LO12_[IS] that point to absolute symbols

The referenced symbol is expected to point to an R_RISCV_*_HI20
relocation. An absolute symbol has no associated section, therefore
there cannot be a matching R_RISCV_*_HI20.

This fixes the crash reported by PR42038. For reference, ld.bfd errors:

    (.init+0x4): dangerous relocation: %pcrel_lo missing matching %pcrel_hi

Differential Revision: https://reviews.llvm.org/D63273

llvm-svn: 365049
This commit is contained in:
Fangrui Song 2019-07-03 15:38:59 +00:00
parent b9bc9f67f5
commit 4e225deab4
2 changed files with 12 additions and 0 deletions

View File

@ -570,6 +570,11 @@ static uint64_t getARMStaticBase(const Symbol &Sym) {
// R_RISCV_PCREL_LO12's symbol and addend.
static Relocation *getRISCVPCRelHi20(const Symbol *Sym, uint64_t Addend) {
const Defined *D = cast<Defined>(Sym);
if (!D->Section) {
error("R_RISCV_PCREL_LO12 relocation points to an absolute symbol: " +
Sym->getName());
return nullptr;
}
InputSection *IS = cast<InputSection>(D->Section);
if (Addend != 0)

View File

@ -0,0 +1,7 @@
# REQUIRES: riscv
# RUN: llvm-mc -filetype=obj -triple=riscv64 %s -o %t.o
# RUN: not ld.lld %t.o --defsym external=0 2>&1 | FileCheck %s
# CHECK: error: R_RISCV_PCREL_LO12 relocation points to an absolute symbol: external
addi sp,sp,%pcrel_lo(external)