From 0f52d45acd6c54aa47082778ffcbafddd423a5b4 Mon Sep 17 00:00:00 2001 From: Jim Wilson Date: Thu, 1 Aug 2019 16:40:15 -0700 Subject: [PATCH] RISC-V: Fix lui relax failure with relro. bfd/ChangeLog Ilia Diachkov * elfnn-riscv.c (_bfd_riscv_relax_lui): Set lui relax safety area to two pages in relro presence. --- bfd/ChangeLog | 5 +++++ bfd/elfnn-riscv.c | 9 +++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 0442775..ae30d7e 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,8 @@ +2019-08-01 Ilia Diachkov + + * elfnn-riscv.c (_bfd_riscv_relax_lui): Set lui relax safety area to + two pages in relro presence. + 2019-08-01 Max Filippov * elf32-xtensa.c (insn_num_slots, get_rsr_lend_opcode) diff --git a/bfd/elfnn-riscv.c b/bfd/elfnn-riscv.c index 003b4f8..706dcb9 100644 --- a/bfd/elfnn-riscv.c +++ b/bfd/elfnn-riscv.c @@ -3562,11 +3562,16 @@ _bfd_riscv_relax_lui (bfd *abfd, } /* Can we relax LUI to C.LUI? Alignment might move the section forward; - account for this assuming page alignment at worst. */ + account for this assuming page alignment at worst. In the presence of + RELRO segment the linker aligns it by one page size, therefore sections + after the segment can be moved more than one page. */ + if (use_rvc && ELFNN_R_TYPE (rel->r_info) == R_RISCV_HI20 && VALID_RVC_LUI_IMM (RISCV_CONST_HIGH_PART (symval)) - && VALID_RVC_LUI_IMM (RISCV_CONST_HIGH_PART (symval + ELF_MAXPAGESIZE))) + && VALID_RVC_LUI_IMM (RISCV_CONST_HIGH_PART (symval) + + (link_info->relro ? 2 * ELF_MAXPAGESIZE + : ELF_MAXPAGESIZE))) { /* Replace LUI with C.LUI if legal (i.e., rd != x0 and rd != x2/sp). */ bfd_vma lui = bfd_get_32 (abfd, contents + rel->r_offset); -- 2.7.4