This is the mail archive of the binutils-cvs@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb/binutils-2_28-branch] hppa -z relro again


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=a2db675b74394252dc8de30921f9064ebd2cdf0e

commit a2db675b74394252dc8de30921f9064ebd2cdf0e
Author: Alan Modra <amodra@gmail.com>
Date:   Tue Feb 14 10:45:51 2017 +1030

    hppa -z relro again
    
    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.

Diff:
---
 bfd/ChangeLog                     | 10 ++++++++++
 bfd/elf-bfd.h                     |  4 ++++
 bfd/elf.c                         | 11 +++++++++++
 bfd/elf32-hppa.c                  |  1 +
 bfd/elfxx-target.h                |  4 ++++
 ld/ChangeLog                      |  8 ++++++++
 ld/testsuite/ld-elf/loadaddr1.d   |  2 +-
 ld/testsuite/ld-elf/loadaddr2.d   |  4 ++--
 ld/testsuite/ld-elf/loadaddr3a.d  |  2 +-
 ld/testsuite/ld-scripts/rgn-at5.d |  8 ++++----
 10 files changed, 46 insertions(+), 8 deletions(-)

diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index d39283a..f20f79d 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,5 +1,15 @@
 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
 	* elf32-hppa.c (allocate_plt_static): Allocate space for relocs
 	if pic.
diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h
index 15d6da0..5de9ab6 100644
--- a/bfd/elf-bfd.h
+++ b/bfd/elf-bfd.h
@@ -1460,6 +1460,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
diff --git a/bfd/elf.c b/bfd/elf.c
index 33fb4d2..94726ba 100644
--- 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)
 	    {
diff --git a/bfd/elf32-hppa.c b/bfd/elf32-hppa.c
index e64ea9a..d5b911c 100644
--- a/bfd/elf32-hppa.c
+++ b/bfd/elf32-hppa.c
@@ -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"
diff --git a/bfd/elfxx-target.h b/bfd/elfxx-target.h
index 00252ce..d063fb7 100644
--- a/bfd/elfxx-target.h
+++ b/bfd/elfxx-target.h
@@ -114,6 +114,9 @@
 #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
diff --git a/ld/ChangeLog b/ld/ChangeLog
index a9545d5..7fdcf3a 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,5 +1,13 @@
 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.
 	* testsuite/ld-powerpc/vxworks1-lib.dd: Adjust to suit.
 
diff --git a/ld/testsuite/ld-elf/loadaddr1.d b/ld/testsuite/ld-elf/loadaddr1.d
index 0fd96a7..adb562a 100644
--- a/ld/testsuite/ld-elf/loadaddr1.d
+++ b/ld/testsuite/ld-elf/loadaddr1.d
@@ -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
diff --git a/ld/testsuite/ld-elf/loadaddr2.d b/ld/testsuite/ld-elf/loadaddr2.d
index 5825fe8..eaa672d 100644
--- a/ld/testsuite/ld-elf/loadaddr2.d
+++ b/ld/testsuite/ld-elf/loadaddr2.d
@@ -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
diff --git a/ld/testsuite/ld-elf/loadaddr3a.d b/ld/testsuite/ld-elf/loadaddr3a.d
index 10cb9a5..0082e1f 100644
--- a/ld/testsuite/ld-elf/loadaddr3a.d
+++ b/ld/testsuite/ld-elf/loadaddr3a.d
@@ -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
diff --git a/ld/testsuite/ld-scripts/rgn-at5.d b/ld/testsuite/ld-scripts/rgn-at5.d
index 7ba9caf..012451a 100644
--- a/ld/testsuite/ld-scripts/rgn-at5.d
+++ b/ld/testsuite/ld-scripts/rgn-at5.d
@@ -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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]