Fix PR ld/20995 for cris-linux
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.
This commit is contained in:
parent
b51e1e94d6
commit
1fbd05e16e
2 changed files with 31 additions and 9 deletions
|
@ -1,3 +1,13 @@
|
|||
2017-01-27 Hans-Peter Nilsson <hp@axis.com>
|
||||
|
||||
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.
|
||||
|
||||
2017-01-25 Sebastian Huber <sebastian.huber@embedded-brains.de>
|
||||
|
||||
* config.bfd (*-*-rtemsaout*): Mark as removed.
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Add table
Reference in a new issue