diff options
-rw-r--r-- | bfd/ChangeLog | 10 | ||||
-rw-r--r-- | bfd/elf-bfd.h | 4 | ||||
-rw-r--r-- | bfd/elf.c | 11 | ||||
-rw-r--r-- | bfd/elf32-hppa.c | 1 | ||||
-rw-r--r-- | bfd/elfxx-target.h | 4 | ||||
-rw-r--r-- | ld/ChangeLog | 8 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/loadaddr1.d | 2 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/loadaddr2.d | 4 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/loadaddr3a.d | 2 | ||||
-rw-r--r-- | ld/testsuite/ld-scripts/rgn-at5.d | 8 |
10 files changed, 46 insertions, 8 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 4be12b8..0c45c44 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 9ea763a..f5a8d75 100644 --- a/bfd/elf-bfd.h +++ b/bfd/elf-bfd.h @@ -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 @@ -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 f0b0b0e..1a7d18c 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 |