This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Fix PR 20995 for cris-linux (please have a look)
- From: Hans-Peter Nilsson <hans-peter dot nilsson at axis dot com>
- To: amodra at gmail dot com
- Cc: binutils at sourceware dot org
- Date: Fri, 27 Jan 2017 01:54:11 +0100
- Subject: Fix PR 20995 for cris-linux (please have a look)
- Authentication-results: sourceware.org; auth=none
Hi. I grew tired of waiting for the new failing test-case to
magically start working for cris-linux and had a look at PR20995
myself - or rather, just the changes in 5474d94f03aedb. It
looks like the pattern of solutions for most other targets can
be followed, modulo elf32-cris.c not being "converted over to
use the new dynamic sections for read-only variables".
This patch being the moral equivalent of a copy-paste of changes
in that commit, I'm not over-confident despite all tests now
passing. Can I ask you to please have a quick look at the following?
Thanks in advance.
In the meantime, I've committed it, as it passes for cris-linux,
(and crisv32-linux, and cris-elf - the last a target where that
particular test never ran, but the code is common) and gets
things back to all-pass for this target.
bfd:
PR ld/20995
* elf32-cris.c (elf_cris_size_dynamic_sections): Handle sdynrelro.
(elf_cris_adjust_dynamic_symbol): Place variables copied into the
executable from read-only sections into sdynrelro.
(elf_cris_finish_dynamic_symbol): Select sreldynrelro for
dynamic relocs in sdynrelro.
(elf_backend_want_dynrelro): Define.
diff --git a/bfd/elf32-cris.c b/bfd/elf32-cris.c
index ba4e494..0c8945e 100644
--- a/bfd/elf32-cris.c
+++ b/bfd/elf32-cris.c
@@ -2278,8 +2278,10 @@ elf_cris_finish_dynamic_symbol (bfd *output_bfd,
&& (h->root.type == bfd_link_hash_defined
|| h->root.type == bfd_link_hash_defweak));
- s = bfd_get_linker_section (dynobj, ".rela.bss");
- BFD_ASSERT (s != NULL);
+ if ((h->root.u.def.section->flags & SEC_READONLY) != 0)
+ s = htab->root.sreldynrelro;
+ else
+ s = htab->root.srelbss;
rela.r_offset = (h->root.u.def.value
+ h->root.u.def.section->output_section->vma
@@ -2840,6 +2842,7 @@ elf_cris_adjust_dynamic_symbol (struct bfd_link_info *info,
struct elf_cris_link_hash_table * htab;
bfd *dynobj;
asection *s;
+ asection *srel;
bfd_size_type plt_entry_size;
htab = elf_cris_hash_table (info);
@@ -3027,23 +3030,30 @@ elf_cris_adjust_dynamic_symbol (struct bfd_link_info *info,
both the dynamic object and the regular object will refer to the
same memory location for the variable. */
- s = bfd_get_linker_section (dynobj, ".dynbss");
- BFD_ASSERT (s != NULL);
-
/* We must generate a R_CRIS_COPY reloc to tell the dynamic linker to
copy the initial value out of the dynamic object and into the
runtime process image. We need to remember the offset into the
.rela.bss section we are going to use. */
+
+ if ((h->root.u.def.section->flags & SEC_READONLY) != 0)
+ {
+ s = htab->root.sdynrelro;
+ srel = htab->root.sreldynrelro;
+ }
+ else
+ {
+ s = htab->root.sdynbss;
+ srel = htab->root.srelbss;
+ }
if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
{
- asection *srel;
-
- srel = bfd_get_linker_section (dynobj, ".rela.bss");
BFD_ASSERT (srel != NULL);
srel->size += sizeof (Elf32_External_Rela);
h->needs_copy = 1;
}
+ BFD_ASSERT (s != NULL);
+
return _bfd_elf_adjust_dynamic_copy (info, h, s);
}
@@ -3787,7 +3797,8 @@ elf_cris_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
}
}
else if (! CONST_STRNEQ (name, ".got")
- && strcmp (name, ".dynbss") != 0)
+ && strcmp (name, ".dynbss") != 0
+ && s != htab->root.sdynrelro)
{
/* It's not one of our sections, so don't allocate space. */
continue;
@@ -4325,6 +4336,7 @@ elf_cris_got_elt_size (bfd *abfd ATTRIBUTE_UNUSED,
#define elf_backend_got_header_size 12
#define elf_backend_got_elt_size elf_cris_got_elt_size
#define elf_backend_dtrel_excludes_plt 1
+#define elf_backend_want_dynrelro 1
/* Later, we my want to optimize RELA entries into REL entries for dynamic
linking and libraries (if it's a win of any significance). Until then,
brgds, H-P