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] Use dynrelro for symbols in relro sections too


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

commit b9f351d14e9862d3521c24820671e6531d604364
Author: Alan Modra <amodra@gmail.com>
Date:   Wed Dec 28 17:04:15 2016 +1030

    Use dynrelro for symbols in relro sections too
    
    	PR ld/20995
    bfd/
    	* elflink.c (elf_link_add_object_symbols): Mark relro sections
    	in dynamic objects SEC_READONLY.
    ld/
    	* testsuite/ld-elf/pr20995c.s: New test file.
    	* testsuite/ld-elf/pr20995-2so.r: Likewise.
    	* testsuite/ld-elf/elf.exp: Run it.

Diff:
---
 bfd/ChangeLog                     |  6 ++++++
 bfd/elflink.c                     | 16 ++++++++++++++++
 ld/ChangeLog                      |  7 +++++++
 ld/testsuite/ld-elf/elf.exp       | 12 ++++++++++++
 ld/testsuite/ld-elf/pr20995-2so.r |  3 +++
 ld/testsuite/ld-elf/pr20995c.s    | 13 +++++++++++++
 6 files changed, 57 insertions(+)

diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 1732504..732fbf8 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,9 @@
+2016-12-28  Alan Modra  <amodra@gmail.com>
+
+	PR ld/20995
+	* elflink.c (elf_link_add_object_symbols): Mark relro sections
+	in dynamic objects SEC_READONLY.
+
 2016-12-26  Alan Modra  <amodra@gmail.com>
 
 	PR ld/20995
diff --git a/bfd/elflink.c b/bfd/elflink.c
index d8d40f1..2fd8883 100644
--- a/bfd/elflink.c
+++ b/bfd/elflink.c
@@ -3819,6 +3819,7 @@ elf_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info)
       const char *soname = NULL;
       char *audit = NULL;
       struct bfd_link_needed_list *rpath = NULL, *runpath = NULL;
+      const Elf_Internal_Phdr *phdr;
       int ret;
 
       /* ld --just-symbols and dynamic objects don't mix very well.
@@ -3968,6 +3969,21 @@ error_free_dyn:
 	  *pn = rpath;
 	}
 
+      /* If we have a PT_GNU_RELRO program header, mark as read-only
+	 all sections contained fully therein.  This makes relro
+	 shared library sections appear as they will at run-time.  */
+      phdr = elf_tdata (abfd)->phdr + elf_elfheader (abfd)->e_phnum;
+      while (--phdr >= elf_tdata (abfd)->phdr)
+	if (phdr->p_type == PT_GNU_RELRO)
+	  {
+	    for (s = abfd->sections; s != NULL; s = s->next)
+	      if ((s->flags & SEC_ALLOC) != 0
+		  && s->vma >= phdr->p_vaddr
+		  && s->vma + s->size <= phdr->p_vaddr + phdr->p_memsz)
+		s->flags |= SEC_READONLY;
+	    break;
+	  }
+
       /* We do not want to include any of the sections in a dynamic
 	 object in the output file.  We hack by simply clobbering the
 	 list of sections in the BFD.  This could be handled more
diff --git a/ld/ChangeLog b/ld/ChangeLog
index 1b8f59a..be179ed 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,10 @@
+2016-12-28  Alan Modra  <amodra@gmail.com>
+
+	PR ld/20995
+	* testsuite/ld-elf/pr20995c.s: New test file.
+	* testsuite/ld-elf/pr20995-2so.r: Likewise.
+	* testsuite/ld-elf/elf.exp: Run it.
+
 2016-12-26  Alan Modra  <amodra@gmail.com>
 
 	PR ld/20995
diff --git a/ld/testsuite/ld-elf/elf.exp b/ld/testsuite/ld-elf/elf.exp
index 9b1fbeb..47f1383 100644
--- a/ld/testsuite/ld-elf/elf.exp
+++ b/ld/testsuite/ld-elf/elf.exp
@@ -134,6 +134,12 @@ if { [check_shared_lib_support] } then {
 	    "-shared" "" ""
 	    {pr20995b.s} {} "pr20995.so"}
     }
+    setup_xfail "tic6x-*-*"
+    run_ld_link_tests {
+	{"Build pr20995-2.so"
+	    "-shared -z relro" "" ""
+	    {pr20995c.s} {{readelf {-l --wide} pr20995-2so.r}} "pr20995-2.so"}
+    }
     # These targets don't copy dynamic variables into .bss.
     setup_xfail "alpha-*-*" "bfin-*-*" "ia64-*-*" "xtensa-*-*"
     run_ld_link_tests {
@@ -141,6 +147,12 @@ if { [check_shared_lib_support] } then {
 	    "" "tmpdir/pr20995.so" ""
 	    {pr20995a.s} {{readelf {-S --wide} pr20995.r}} "pr20995"}
     }
+    setup_xfail "alpha-*-*" "bfin-*-*" "ia64-*-*" "xtensa-*-*"
+    run_ld_link_tests {
+	{"pr20995-2"
+	    "" "tmpdir/pr20995-2.so" ""
+	    {pr20995a.s} {{readelf {-S --wide} pr20995.r}} "pr20995-2"}
+    }
 }
 
 set test_list [lsort [glob -nocomplain $srcdir/$subdir/*.d]]
diff --git a/ld/testsuite/ld-elf/pr20995-2so.r b/ld/testsuite/ld-elf/pr20995-2so.r
new file mode 100644
index 0000000..3cd4c27
--- /dev/null
+++ b/ld/testsuite/ld-elf/pr20995-2so.r
@@ -0,0 +1,3 @@
+#...
+  GNU_RELRO .*
+#pass
diff --git a/ld/testsuite/ld-elf/pr20995c.s b/ld/testsuite/ld-elf/pr20995c.s
new file mode 100644
index 0000000..ccca92d
--- /dev/null
+++ b/ld/testsuite/ld-elf/pr20995c.s
@@ -0,0 +1,13 @@
+	.data
+	.type rw,%object
+	.globl rw
+rw:
+	.dc.a 0
+	.size rw, . - rw
+
+	.section .data.rel.ro,"aw",%progbits
+	.type ro,%object
+	.globl ro
+ro:
+	.dc.a 0
+	.size ro, . - ro


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