From: Alan Modra Date: Wed, 28 Dec 2016 06:34:15 +0000 (+1030) Subject: Use dynrelro for symbols in relro sections too X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=9acc85a62eb76c270724bba15c889d2d05567b6a;p=binutils-gdb.git 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 --git a/bfd/ChangeLog b/bfd/ChangeLog index 4d7bd7763c5..d1b012fe0bc 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,9 @@ +2016-12-28 Alan Modra + + PR ld/20995 + * elflink.c (elf_link_add_object_symbols): Mark relro sections + in dynamic objects SEC_READONLY. + 2016-12-26 Alan Modra PR ld/20995 diff --git a/bfd/elflink.c b/bfd/elflink.c index d8d40f1441b..2fd8883fd60 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 1b8f59aa600..be179edce54 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,10 @@ +2016-12-28 Alan Modra + + 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 PR ld/20995 diff --git a/ld/testsuite/ld-elf/elf.exp b/ld/testsuite/ld-elf/elf.exp index 9b1fbeb9a83..47f13832edd 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 00000000000..3cd4c278cc4 --- /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 00000000000..ccca92d1aae --- /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