hppa -z relro again
authorAlan Modra <amodra@gmail.com>
Tue, 14 Feb 2017 00:15:51 +0000 (10:45 +1030)
committerAlan Modra <amodra@gmail.com>
Thu, 16 Feb 2017 12:39:38 +0000 (23:09 +1030)
I misunderstood the hppa alias problem.  File offsets of segments need
to be such that no page is mapped twice with different permissions.
(Which still seems to me like something the kernel could fix, but
anyhow, this is not so difficult to achieve in ld.)

PR 21000
bfd/
* elf-bfd.h (struct elf_backend_data): Add no_page_alias.
* elfxx-target.h (elf_backend_no_page_alias): Define.
(elfNN_bed): Init new field.
* elf.c (assign_file_positions_for_load_sections): If no_page_alias
ensure PT_LOAD segment starts on a new page.
* elf32-hppa.c (elf_backend_no_page_alias): Define.
ld/
* testsuite/ld-elf/loadaddr1.d: Adjust for hppa file offsets.
* testsuite/ld-elf/loadaddr2.d: Likewise.
* testsuite/ld-elf/loadaddr3a.d: Likewise.
* testsuite/ld-scripts/rgn-at5.d: Likewise.

bfd/ChangeLog
bfd/elf-bfd.h
bfd/elf.c
bfd/elf32-hppa.c
bfd/elfxx-target.h
ld/ChangeLog
ld/testsuite/ld-elf/loadaddr1.d
ld/testsuite/ld-elf/loadaddr2.d
ld/testsuite/ld-elf/loadaddr3a.d
ld/testsuite/ld-scripts/rgn-at5.d

index 4be12b802272c8a8130f2f4ebd278687fb6b6c98..0c45c44bfed94f00d93f043e8a521e7cf270c234 100644 (file)
@@ -1,3 +1,13 @@
+2017-02-16  Alan Modra  <amodra@gmail.com>
+
+       PR 21000
+       * elf-bfd.h (struct elf_backend_data): Add no_page_alias.
+       * elfxx-target.h (elf_backend_no_page_alias): Define.
+       (elfNN_bed): Init new field.
+       * elf.c (assign_file_positions_for_load_sections): If no_page_alias
+       ensure PT_LOAD segment starts on a new page.
+       * elf32-hppa.c (elf_backend_no_page_alias): Define.
+
 2017-02-16  Alan Modra  <amodra@gmail.com>
 
        PR 21132
index 9ea763a9fc75cab9c686c79922d6b2f18cb0fd9d..f5a8d75e5a0c90c4ffff89c203510f7c79c82f3b 100644 (file)
@@ -1461,6 +1461,10 @@ struct elf_backend_data
      This field indicates whether this behavior is required.  */
   unsigned want_p_paddr_set_to_zero : 1;
 
+  /* Target has broken hardware and/or kernel that requires pages not
+     to be mapped twice with different permissions.  */
+  unsigned no_page_alias : 1;
+
   /* True if an object file lacking a .note.GNU-stack section
      should be assumed to be requesting exec stack.  At least one
      other file in the link needs to have a .note.GNU-stack section
index 33fb4d2c3435c15e33c2bc10a3dc025a7470a8a8..94726bad2e46782d1e6ce2168cea5d39c2882e63 100644 (file)
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -5125,6 +5125,7 @@ assign_file_positions_for_load_sections (bfd *abfd,
   Elf_Internal_Phdr *p;
   file_ptr off;
   bfd_size_type maxpagesize;
+  unsigned int pt_load_count = 0;
   unsigned int alloc;
   unsigned int i, j;
   bfd_vma header_pad = 0;
@@ -5252,6 +5253,7 @@ assign_file_positions_for_load_sections (bfd *abfd,
            maxpagesize = m->p_align;
 
          p->p_align = maxpagesize;
+         pt_load_count += 1;
        }
       else if (m->p_align_valid)
        p->p_align = m->p_align;
@@ -5303,6 +5305,15 @@ assign_file_positions_for_load_sections (bfd *abfd,
              }
 
          off_adjust = vma_page_aligned_bias (p->p_vaddr, off, align);
+
+         /* Broken hardware and/or kernel require that files do not
+            map the same page with different permissions on some hppa
+            processors.  */
+         if (pt_load_count > 1
+             && bed->no_page_alias
+             && (off & (maxpagesize - 1)) != 0
+             && (off & -maxpagesize) == ((off + off_adjust) & -maxpagesize))
+           off_adjust += maxpagesize;
          off += off_adjust;
          if (no_contents)
            {
index e64ea9aff98c1eaf53bd04e6622bb32a3b6b5e4d..d5b911cf6a18bc85a7c79df8c87b3e07dddef7e2 100644 (file)
@@ -4646,6 +4646,7 @@ elf32_hppa_elf_get_symbol_type (Elf_Internal_Sym *elf_sym, int type)
 #define elf_backend_want_dynrelro           1
 #define elf_backend_rela_normal                     1
 #define elf_backend_dtrel_excludes_plt      1
+#define elf_backend_no_page_alias           1
 
 #define TARGET_BIG_SYM         hppa_elf32_vec
 #define TARGET_BIG_NAME                "elf32-hppa"
index 00252cee84bc480bee211b530130494f63d88e0e..d063fb7f1bae918706f7d34cde622070e1e75903 100644 (file)
 #ifndef elf_backend_want_p_paddr_set_to_zero
 #define elf_backend_want_p_paddr_set_to_zero 0
 #endif
+#ifndef elf_backend_no_page_alias
+#define elf_backend_no_page_alias 0
+#endif
 #ifndef elf_backend_default_execstack
 #define elf_backend_default_execstack 1
 #endif
@@ -860,6 +863,7 @@ static struct elf_backend_data elfNN_bed =
   elf_backend_want_dynbss,
   elf_backend_want_dynrelro,
   elf_backend_want_p_paddr_set_to_zero,
+  elf_backend_no_page_alias,
   elf_backend_default_execstack,
   elf_backend_caches_rawsize,
   elf_backend_extern_protected_data
index f0b0b0ed9e9728698742ca14ca97351c573705d8..1a7d18ca9317021d9026a947ba4b190bfb0d2eb4 100644 (file)
@@ -1,3 +1,11 @@
+2017-02-16  Alan Modra  <amodra@gmail.com>
+
+       PR 21000
+       * testsuite/ld-elf/loadaddr1.d: Adjust for hppa file offsets.
+       * testsuite/ld-elf/loadaddr2.d: Likewise.
+       * testsuite/ld-elf/loadaddr3a.d: Likewise.
+       * testsuite/ld-scripts/rgn-at5.d: Likewise.
+
 2017-02-16  Alan Modra  <amodra@gmail.com>
 
        * testsuite/ld-powerpc/vxworks1-lib.s: Correct addi to addic.
index 0fd96a78ea3ace10ad158e9398b540fa742ca468..adb562a90198a06455226a3c5bf1dd6d461f9440 100644 (file)
@@ -6,5 +6,5 @@
 #...
   LOAD +0x000000 0xf*80000000 0xf*80000000 0x100050 0x100050 RWE 0x200000
   LOAD +0x200000 0xf*ff600000 0xf*80101000 0x0*10 0x0*10 R E 0x200000
-  LOAD +0x302000 0xf*80102000 0xf*80102000 0x0*10 0x0*10 RW  0x200000
+  LOAD +0x[35]02000 0xf*80102000 0xf*80102000 0x0*10 0x0*10 RW  0x200000
 #pass
index 5825fe8494ce002db7acc57a942a975535a35b24..eaa672da17e2f1c623caf2553cf863b3b18a5006 100644 (file)
@@ -5,6 +5,6 @@
 
 #...
   LOAD +0x000000 0xf*80000000 0xf*80000000 0x100050 0x100050 RWE 0x200000
-  LOAD +0x110000 0xf*80110000 0xf*80101000 0x0*10 0x0*10 R E 0x200000
-  LOAD +0x302000 0xf*80302000 0xf*80302000 0x0*10 0x0*10 RW  0x200000
+  LOAD +0x[13]10000 0xf*80110000 0xf*80101000 0x0*10 0x0*10 R E 0x200000
+  LOAD +0x[35]02000 0xf*80302000 0xf*80302000 0x0*10 0x0*10 RW  0x200000
 #pass
index 10cb9a588f477b994ad8880987f6370f1bd78e47..0082e1f033e34213384e8abf9cb9e8bb70af4c47 100644 (file)
@@ -5,5 +5,5 @@
 
 #...
   LOAD +0x000000 0x0*00000000 0x0*00000000 0x0*0110 0x0*0110 R E 0x.*
-  LOAD +0x000200 0x0*00000200 0x0*00000110 0x0*0010 0x0*0010 RW  0x.*
+  LOAD +0x[02]00200 0x0*00000200 0x0*00000110 0x0*0010 0x0*0010 RW  0x.*
 #pass
index 7ba9cafb2f109c07d53ac6939d0b7f842ed35543..012451ae8ab45fcee8ce38888bb7b96d892a2aa2 100644 (file)
@@ -13,8 +13,8 @@ Sections:
 Idx +Name +Size +VMA +LMA +File off +Algn +Flags
   0 .sec0 +0+4 +0+2000 +0+2000 +0+1000 +.*
   1 .sec1 +0+4 +0+1000 +0+2004 +0+2000 +.*
-  2 .sec2 +0+4 +0+4000 +0+603c +0+4000 +.*
-  3 .sec3 +0+4 +0+5000 +0+5000 +0+3000 +.*
-  4 .sec4 +0+4 +0+2008 +0+2008 +0+2008 +.*
-  5 .sec5 +0+4 +0+200c +0+200c +0+200c +.*
+  2 .sec2 +0+4 +0+4000 +0+603c +0+[45]000 +.*
+  3 .sec3 +0+4 +0+5000 +0+5000 +0+[34]000 +.*
+  4 .sec4 +0+4 +0+2008 +0+2008 +0+[23]008 +.*
+  5 .sec5 +0+4 +0+200c +0+200c +0+[23]00c +.*
 #pass