[ELF][RISCV] Treat R_RISCV_{ADD,SET,SUB}* as link-time constants
R_RISCV_{ADD,SET,SUB}* are used for local label computation.
Add a new RelExpr member R_RISCV_ADD to represent them.
R_RISCV_ADD is treated as a link-time constant because otherwise
R_RISCV_{ADD,SET,SUB}* are not allowed in -pie/-shared mode.
In glibc Scrt1.o, .rela.eh_frame contains such relocations.
Because .eh_frame is not writable, we get this error:
ld.lld: error: can't create dynamic relocation R_RISCV_ADD32 against symbol: .L0 in readonly segment; recompil object files with -fPIC or pass '-Wl,-z,notext' to allow text relocations in the output
>>> defined in ..../riscv64-linux-gnu/lib/Scrt1.o
With D63076 and this patch, I can run -pie/-shared programs linked against glibc.
Note llvm-mc cannot currently produce R_RISCV_SET* so they are not tested.
Reviewed By: ruiu
Differential Revision: https://reviews.llvm.org/D63183
llvm-svn: 363128
2019-06-12 15:53:06 +08:00
|
|
|
# REQUIRES: riscv
|
|
|
|
# RUN: llvm-mc -filetype=obj -triple=riscv32 -mattr=+relax %s -o %t.32.o
|
|
|
|
# RUN: ld.lld -pie %t.32.o -o %t.32
|
|
|
|
# RUN: llvm-readelf -x .rodata %t.32 | FileCheck --check-prefix=HEX %s
|
|
|
|
|
|
|
|
# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax %s -o %t.64.o
|
|
|
|
# RUN: ld.lld -shared %t.64.o -o %t.64
|
|
|
|
# RUN: llvm-readelf -x .rodata %t.64 | FileCheck --check-prefix=HEX %s
|
|
|
|
|
|
|
|
# HEX: section '.rodata':
|
|
|
|
# HEX-NEXT: 0x{{[0-9a-f]+}} 04000000 00000000 04000000 040004
|
|
|
|
|
|
|
|
## R_RISCV_ADD* and R_RISCV_SUB* are link-time constants, otherwise they are
|
|
|
|
## not allowed in -pie/-shared mode.
|
|
|
|
|
|
|
|
.global _start
|
|
|
|
_start:
|
|
|
|
.L0:
|
|
|
|
ret
|
|
|
|
.L1:
|
|
|
|
|
|
|
|
.rodata
|
|
|
|
.dword .L1 - .L0
|
|
|
|
.word .L1 - .L0
|
|
|
|
.half .L1 - .L0
|
|
|
|
.byte .L1 - .L0
|
2019-07-03 20:48:04 +08:00
|
|
|
|
|
|
|
## Debug section may use R_RISCV_ADD64/R_RISCV_SUB64 pairs to measure lengths
|
|
|
|
## of code ranges (e.g. DW_AT_high_pc). Check we allow R_RISCV_ADD*/R_RISCV_SUB*
|
|
|
|
## in such non-SHF_ALLOC sections in -pie/-shared mode.
|
|
|
|
.section .debug_info
|
|
|
|
.quad .L1 - .L0
|