diff options
author | Fangrui Song <maskray@google.com> | 2019-07-03 15:38:59 +0000 |
---|---|---|
committer | Fangrui Song <maskray@google.com> | 2019-07-03 15:38:59 +0000 |
commit | 4e225deab4de4c0c9ca353e611b1a5b1c7d89ec2 (patch) | |
tree | c0867f35d2239ba2d3f827bd7201d8a7a7539e4d | |
parent | b9bc9f67f573dc5bc1bc4546bfee85877cae4061 (diff) | |
download | bcm5719-llvm-4e225deab4de4c0c9ca353e611b1a5b1c7d89ec2.tar.gz bcm5719-llvm-4e225deab4de4c0c9ca353e611b1a5b1c7d89ec2.zip |
[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
-rw-r--r-- | lld/ELF/InputSection.cpp | 5 | ||||
-rw-r--r-- | lld/test/ELF/riscv-pcrel-hilo-error.s | 7 |
2 files changed, 12 insertions, 0 deletions
diff --git a/lld/ELF/InputSection.cpp b/lld/ELF/InputSection.cpp index 08fbbe8e3c6..e11cbbb9a22 100644 --- a/lld/ELF/InputSection.cpp +++ b/lld/ELF/InputSection.cpp @@ -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) diff --git a/lld/test/ELF/riscv-pcrel-hilo-error.s b/lld/test/ELF/riscv-pcrel-hilo-error.s new file mode 100644 index 00000000000..bfc205520bd --- /dev/null +++ b/lld/test/ELF/riscv-pcrel-hilo-error.s @@ -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) |