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.
This commit is contained in:
Alan Modra 2016-12-28 17:04:15 +10:30
parent b733bcb7f5
commit 9acc85a62e
6 changed files with 57 additions and 0 deletions

View file

@ -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> 2016-12-26 Alan Modra <amodra@gmail.com>
PR ld/20995 PR ld/20995

View file

@ -3819,6 +3819,7 @@ elf_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info)
const char *soname = NULL; const char *soname = NULL;
char *audit = NULL; char *audit = NULL;
struct bfd_link_needed_list *rpath = NULL, *runpath = NULL; struct bfd_link_needed_list *rpath = NULL, *runpath = NULL;
const Elf_Internal_Phdr *phdr;
int ret; int ret;
/* ld --just-symbols and dynamic objects don't mix very well. /* ld --just-symbols and dynamic objects don't mix very well.
@ -3968,6 +3969,21 @@ error_free_dyn:
*pn = rpath; *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 /* We do not want to include any of the sections in a dynamic
object in the output file. We hack by simply clobbering the object in the output file. We hack by simply clobbering the
list of sections in the BFD. This could be handled more list of sections in the BFD. This could be handled more

View file

@ -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> 2016-12-26 Alan Modra <amodra@gmail.com>
PR ld/20995 PR ld/20995

View file

@ -134,6 +134,12 @@ if { [check_shared_lib_support] } then {
"-shared" "" "" "-shared" "" ""
{pr20995b.s} {} "pr20995.so"} {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. # These targets don't copy dynamic variables into .bss.
setup_xfail "alpha-*-*" "bfin-*-*" "ia64-*-*" "xtensa-*-*" setup_xfail "alpha-*-*" "bfin-*-*" "ia64-*-*" "xtensa-*-*"
run_ld_link_tests { run_ld_link_tests {
@ -141,6 +147,12 @@ if { [check_shared_lib_support] } then {
"" "tmpdir/pr20995.so" "" "" "tmpdir/pr20995.so" ""
{pr20995a.s} {{readelf {-S --wide} pr20995.r}} "pr20995"} {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]] set test_list [lsort [glob -nocomplain $srcdir/$subdir/*.d]]

View file

@ -0,0 +1,3 @@
#...
GNU_RELRO .*
#pass

View file

@ -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