This is the mail archive of the binutils@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]

Re: PATCH: PR bfd/14207: linker can produce a NULL GNU_RELRO segment


On Tue, Jun 12, 2012 at 2:53 AM, nick clifton <nickc@redhat.com> wrote:
> Hi H.J.
>
>
>> The real bug is in _bfd_elf_map_sections_to_segments. ?It
>> failed to properly compute file size for PT_GNU_RELRO segment.
>> Here is an updated patch. ?It removes PT_GNU_RELRO segment
>> if doesn't fit. ?OK to install?
>
>
> Approved - please apply.
>
> Cheers
> ?Nick
>

This is the patch I checked.

Thanks.


-- 
H.J.
---
bfd/

	PR bfd/14207
	* elf.c (assign_file_positions_for_non_load_sections): Abort if
	PT_GNU_RELRO segment doesn't fit in PT_LOAD segment.

ld/testsuite/

	PR ld/14207
	* ld-x86-64/x86-64.exp: Run pr14207.

	* ld-x86-64/pr14207.d: New file.
	* ld-x86-64/pr14207.s: Likewise.

diff --git a/bfd/elf.c b/bfd/elf.c
index 6755a4e..0296ef5 100644
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -4931,6 +4931,11 @@ assign_file_positions_for_non_load_sections (bfd *abfd,
 		      && lp->p_vaddr + lp->p_filesz >= link_info->relro_end)
 		    break;
 		}
+
+	      /* PR ld/14207.  If the RELRO segment doesn't fit in the
+		 LOAD segment, it should be removed.  */
+	      if (lp == (phdrs + count))
+		abort ();
 	    }
 	  else
 	    {
diff --git a/ld/testsuite/ld-x86-64/pr14207.d b/ld/testsuite/ld-x86-64/pr14207.d
new file mode 100644
index 0000000..2362e88
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/pr14207.d
@@ -0,0 +1,9 @@
+#name: PR ld/14207
+#as: --64
+#ld: -melf_x86_64 -shared -z relro -z now
+#readelf: -l --wide
+
+#failif
+#...
+  NULL +.*
+#...
diff --git a/ld/testsuite/ld-x86-64/pr14207.s b/ld/testsuite/ld-x86-64/pr14207.s
new file mode 100644
index 0000000..496e67e
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/pr14207.s
@@ -0,0 +1,24 @@
+	
+	.section .ctors, "aw"
+	.space 0x10, 1
+	
+	.section .dtors, "aw"
+	.space 0x10, 2
+
+	.section .jcr, "aw"
+	.space 0x8, 3
+	
+	.section .data.rel.ro
+	.p2align 4
+	.space 0x20, 3
+
+	.section .dynamic
+	.space 0xb0, 2
+
+	.section .got
+	.space 0x2a8, 4
+	
+	.bss
+	.zero 0x840
+
+
diff --git a/ld/testsuite/ld-x86-64/x86-64.exp
b/ld/testsuite/ld-x86-64/x86-64.exp
index b9af8de..1eb1b1c 100644
--- a/ld/testsuite/ld-x86-64/x86-64.exp
+++ b/ld/testsuite/ld-x86-64/x86-64.exp
@@ -209,6 +209,7 @@ run_dump_test "pr13947"
 run_dump_test "pr12570a"
 run_dump_test "pr12570b"
 run_dump_test "pr14215"
+run_dump_test "pr14207"

 if { ![istarget "x86_64-*-linux*"] && ![istarget "x86_64-*-nacl*"]} {
     return


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