dynrelro section for read-only dynamic symbols copied into executable
Alan Modra
amodra@gmail.com
Wed Dec 28 06:51:00 GMT 2016
On Tue, Dec 27, 2016 at 08:55:33PM -0800, Cary Coutant wrote:
> It doesn't look like you caught the case where the original variable
> is in the .data.rel.ro section (which is marked SHF_WRITE initially,
> but placed in the PT_GNU_RELRO segment). These variables should also
> be copied to .data.rel.ro in the main executable.
Thanks, indeed they should. I'll be committing the following,
possibly with some more testsuite xfails, after testing.
bfd/
* elflink.c (elf_link_add_object_symbols): Mark relro sections
SEC_READONLY.
ld/
* testsuite/ld-elf/pr20995c.s: New test.
* testsuite/ld-elf/elf.exp: Run it.
diff --git a/bfd/elflink.c b/bfd/elflink.c
index 34035b0..9cf3672 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/testsuite/ld-elf/elf.exp b/ld/testsuite/ld-elf/elf.exp
index 9b1fbeb..a236d9d 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} {} "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/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
--
Alan Modra
Australia Development Lab, IBM
More information about the Binutils
mailing list