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

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>
PR ld/20995

View File

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

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