mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-07-15 05:01:13 +08:00
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:
@ -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>
|
2017-01-25 Sebastian Huber <sebastian.huber@embedded-brains.de>
|
||||||
|
|
||||||
* config.bfd (*-*-rtemsaout*): Mark as removed.
|
* 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_defined
|
||||||
|| h->root.type == bfd_link_hash_defweak));
|
|| h->root.type == bfd_link_hash_defweak));
|
||||||
|
|
||||||
s = bfd_get_linker_section (dynobj, ".rela.bss");
|
if ((h->root.u.def.section->flags & SEC_READONLY) != 0)
|
||||||
BFD_ASSERT (s != NULL);
|
s = htab->root.sreldynrelro;
|
||||||
|
else
|
||||||
|
s = htab->root.srelbss;
|
||||||
|
|
||||||
rela.r_offset = (h->root.u.def.value
|
rela.r_offset = (h->root.u.def.value
|
||||||
+ h->root.u.def.section->output_section->vma
|
+ 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;
|
struct elf_cris_link_hash_table * htab;
|
||||||
bfd *dynobj;
|
bfd *dynobj;
|
||||||
asection *s;
|
asection *s;
|
||||||
|
asection *srel;
|
||||||
bfd_size_type plt_entry_size;
|
bfd_size_type plt_entry_size;
|
||||||
|
|
||||||
htab = elf_cris_hash_table (info);
|
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
|
both the dynamic object and the regular object will refer to the
|
||||||
same memory location for the variable. */
|
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
|
/* 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
|
copy the initial value out of the dynamic object and into the
|
||||||
runtime process image. We need to remember the offset into the
|
runtime process image. We need to remember the offset into the
|
||||||
.rela.bss section we are going to use. */
|
.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)
|
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);
|
BFD_ASSERT (srel != NULL);
|
||||||
srel->size += sizeof (Elf32_External_Rela);
|
srel->size += sizeof (Elf32_External_Rela);
|
||||||
h->needs_copy = 1;
|
h->needs_copy = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BFD_ASSERT (s != NULL);
|
||||||
|
|
||||||
return _bfd_elf_adjust_dynamic_copy (info, h, s);
|
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")
|
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. */
|
/* It's not one of our sections, so don't allocate space. */
|
||||||
continue;
|
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_header_size 12
|
||||||
#define elf_backend_got_elt_size elf_cris_got_elt_size
|
#define elf_backend_got_elt_size elf_cris_got_elt_size
|
||||||
#define elf_backend_dtrel_excludes_plt 1
|
#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
|
/* 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,
|
linking and libraries (if it's a win of any significance). Until then,
|
||||||
|
Reference in New Issue
Block a user