RISC-V: Fix lui relax failure with relro.
authorJim Wilson <jimw@sifive.com>
Thu, 1 Aug 2019 23:40:15 +0000 (16:40 -0700)
committerJim Wilson <jimw@sifive.com>
Thu, 1 Aug 2019 23:40:15 +0000 (16:40 -0700)
bfd/ChangeLog
Ilia Diachkov  <ilia.diachkov@optimitech.com>
* elfnn-riscv.c (_bfd_riscv_relax_lui): Set lui relax safety area to
two pages in relro presence.

bfd/ChangeLog
bfd/elfnn-riscv.c

index 04427754bd378d4905455029f67b429566c029bd..ae30d7e94b9b7fc5ed4eecbec26c2a43fd606b78 100644 (file)
@@ -1,3 +1,8 @@
+2019-08-01  Ilia Diachkov  <ilia.diachkov@optimitech.com>
+
+       * elfnn-riscv.c (_bfd_riscv_relax_lui): Set lui relax safety area to
+       two pages in relro presence.
+
 2019-08-01  Max Filippov  <jcmvbkbc@gmail.com>
 
        * elf32-xtensa.c (insn_num_slots, get_rsr_lend_opcode)
index 003b4f868d99211d9c6c32c85bb567ed6978e273..706dcb923f113bb9553ad7877afc09c1015c908a 100644 (file)
@@ -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);