This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
PATCH: PR ld/14215: ld creates bad GNU_RELRO segment
- From: "H.J. Lu" <hongjiu dot lu at intel dot com>
- To: binutils at sourceware dot org
- Date: Sat, 9 Jun 2012 14:06:14 -0700
- Subject: PATCH: PR ld/14215: ld creates bad GNU_RELRO segment
- Reply-to: "H.J. Lu" <hjl dot tools at gmail dot com>
Hi,
We should check if .got.plt section exists before putting the first N
bytes in PT_GNU_RELRO segment. OK to install?
Thanks.
H.J.
--
ld/
2012-06-09 H.J. Lu <hongjiu.lu@intel.com>
PR ld/14215
* ldexp.c (fold_binary): Check if .got.plt section exists
before putting the first N bytes in PT_GNU_RELRO segment.
ld/testsuite/
2012-06-09 H.J. Lu <hongjiu.lu@intel.com>
PR ld/14215
* ld-i386/i386.exp: Run pr14215.
* ld-x86-64/x86-64.exp: Likewise.
* ld-i386/pr14215.d: New file.
* ld-i386/pr14215.s: Likewise.
* ld-x86-64/pr14215.d: Likewise.
* ld-x86-64/pr14215.s: Likewise.
diff --git a/ld/ldexp.c b/ld/ldexp.c
index 3bddc81..07b1fff 100644
--- a/ld/ldexp.c
+++ b/ld/ldexp.c
@@ -487,9 +487,21 @@ fold_binary (etree_type *tree)
|| expld.dataseg.phase == exp_dataseg_relro_adjust
|| expld.dataseg.phase == exp_dataseg_done)
{
+ asection *gotplt;
+ bfd_vma value;
+ gotplt = bfd_get_section_by_name (link_info.output_bfd,
+ ".got.plt");
+ /* Check if .got.plt section exists before putting the
+ first N bytes in PT_GNU_RELRO segment. */
+ if (gotplt != NULL
+ && gotplt->output_section != NULL
+ && gotplt->output_section->rawsize != 0)
+ value = expld.result.value;
+ else
+ value = 0;
if (expld.dataseg.phase == exp_dataseg_align_seen
|| expld.dataseg.phase == exp_dataseg_relro_adjust)
- expld.dataseg.relro_end = lhs.value + expld.result.value;
+ expld.dataseg.relro_end = lhs.value + value;
if (expld.dataseg.phase == exp_dataseg_relro_adjust
&& (expld.dataseg.relro_end
@@ -497,8 +509,7 @@ fold_binary (etree_type *tree)
{
expld.dataseg.relro_end += expld.dataseg.pagesize - 1;
expld.dataseg.relro_end &= ~(expld.dataseg.pagesize - 1);
- expld.result.value = (expld.dataseg.relro_end
- - expld.result.value);
+ expld.result.value = expld.dataseg.relro_end - value;
}
else
expld.result.value = lhs.value;
diff --git a/ld/testsuite/ld-i386/i386.exp b/ld/testsuite/ld-i386/i386.exp
index 47f918f..03367ca 100644
--- a/ld/testsuite/ld-i386/i386.exp
+++ b/ld/testsuite/ld-i386/i386.exp
@@ -245,3 +245,4 @@ if { !([istarget "i?86-*-linux*"]
run_dump_test "compressed1"
run_dump_test "pr12627"
run_dump_test "pr13302"
+run_dump_test "pr14215"
diff --git a/ld/testsuite/ld-i386/pr14215.d b/ld/testsuite/ld-i386/pr14215.d
new file mode 100644
index 0000000..78ec994
--- /dev/null
+++ b/ld/testsuite/ld-i386/pr14215.d
@@ -0,0 +1,9 @@
+#name: PR ld/14215
+#as: --32
+#ld: -melf_i386 -shared -z relro
+#readelf: -l --wide
+
+#failif
+#...
+ 03 .dynamic .got .data
+#...
diff --git a/ld/testsuite/ld-i386/pr14215.s b/ld/testsuite/ld-i386/pr14215.s
new file mode 100644
index 0000000..df0cbc2
--- /dev/null
+++ b/ld/testsuite/ld-i386/pr14215.s
@@ -0,0 +1,4 @@
+ .section .got
+ .space 0x2a8, 4
+ .data
+ .zero 12
diff --git a/ld/testsuite/ld-x86-64/pr14215.d b/ld/testsuite/ld-x86-64/pr14215.d
new file mode 100644
index 0000000..7d8e90d
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/pr14215.d
@@ -0,0 +1,9 @@
+#name: PR ld/14215
+#as: --64
+#ld: -melf_x86_64 -shared -z relro
+#readelf: -l --wide
+
+#failif
+#...
+ 03 .dynamic .got .data
+#...
diff --git a/ld/testsuite/ld-x86-64/pr14215.s b/ld/testsuite/ld-x86-64/pr14215.s
new file mode 100644
index 0000000..281b638
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/pr14215.s
@@ -0,0 +1,4 @@
+ .section .got
+ .space 0x2a8, 4
+ .data
+ .zero 24
diff --git a/ld/testsuite/ld-x86-64/x86-64.exp b/ld/testsuite/ld-x86-64/x86-64.exp
index 7d2934f..b9af8de 100644
--- a/ld/testsuite/ld-x86-64/x86-64.exp
+++ b/ld/testsuite/ld-x86-64/x86-64.exp
@@ -208,6 +208,7 @@ run_dump_test "pr12921"
run_dump_test "pr13947"
run_dump_test "pr12570a"
run_dump_test "pr12570b"
+run_dump_test "pr14215"
if { ![istarget "x86_64-*-linux*"] && ![istarget "x86_64-*-nacl*"]} {
return