xtensa: move dynamic relocations sections consistency check

The function elf_xtensa_finish_dynamic_sections checks that sizes of
sections .rela.dyn and .rela.plt match number of corresponding relocation
records, but the check is only done when .rela.plt is non-empty, so, e.g.
it is never run for the static PIE.
Rearrange the test so that .rela.dyn and .rela.plt are checked always.

bfd/
2018-07-23  Max Filippov  <jcmvbkbc@gmail.com>

	* elf32-xtensa.c (elf_xtensa_finish_dynamic_sections): Move
	relocation sections consistency check to always check both
	.rela.dyn and .rela.plt when they exist. Rearrange variable
	definition and assignment places.
This commit is contained in:
Max Filippov
2018-07-22 18:59:11 -07:00
parent 5d3a462f05
commit f82863d797
2 changed files with 18 additions and 11 deletions

View File

@ -1,3 +1,10 @@
2018-07-23 Max Filippov <jcmvbkbc@gmail.com>
* elf32-xtensa.c (elf_xtensa_finish_dynamic_sections): Move
relocation sections consistency check to always check both
.rela.dyn and .rela.plt when they exist. Rearrange variable
definition and assignment places.
2018-07-23 Max Filippov <jcmvbkbc@gmail.com> 2018-07-23 Max Filippov <jcmvbkbc@gmail.com>
* elf32-xtensa.c (shrink_dynamic_reloc_sections): Shrink dynamic * elf32-xtensa.c (shrink_dynamic_reloc_sections): Shrink dynamic

View File

@ -3156,7 +3156,7 @@ elf_xtensa_finish_dynamic_sections (bfd *output_bfd,
{ {
struct elf_xtensa_link_hash_table *htab; struct elf_xtensa_link_hash_table *htab;
bfd *dynobj; bfd *dynobj;
asection *sdyn, *srelplt, *sgot, *sxtlit, *sgotloc; asection *sdyn, *srelplt, *srelgot, *sgot, *sxtlit, *sgotloc;
Elf32_External_Dyn *dyncon, *dynconend; Elf32_External_Dyn *dyncon, *dynconend;
int num_xtlit_entries = 0; int num_xtlit_entries = 0;
@ -3186,15 +3186,15 @@ elf_xtensa_finish_dynamic_sections (bfd *output_bfd,
} }
srelplt = htab->elf.srelplt; srelplt = htab->elf.srelplt;
srelgot = htab->elf.srelgot;
if (srelplt && srelplt->size != 0) if (srelplt && srelplt->size != 0)
{ {
asection *sgotplt, *srelgot, *spltlittbl; asection *sgotplt, *spltlittbl;
int chunk, plt_chunks, plt_entries; int chunk, plt_chunks, plt_entries;
Elf_Internal_Rela irela; Elf_Internal_Rela irela;
bfd_byte *loc; bfd_byte *loc;
unsigned rtld_reloc; unsigned rtld_reloc;
srelgot = htab->elf.srelgot;
spltlittbl = htab->spltlittbl; spltlittbl = htab->spltlittbl;
BFD_ASSERT (srelgot != NULL && spltlittbl != NULL); BFD_ASSERT (srelgot != NULL && spltlittbl != NULL);
@ -3260,14 +3260,6 @@ elf_xtensa_finish_dynamic_sections (bfd *output_bfd,
spltlittbl->contents + (chunk * 8) + 4); spltlittbl->contents + (chunk * 8) + 4);
} }
/* All the dynamic relocations have been emitted at this point.
Make sure the relocation sections are the correct size. */
if (srelgot->size != (sizeof (Elf32_External_Rela)
* srelgot->reloc_count)
|| srelplt->size != (sizeof (Elf32_External_Rela)
* srelplt->reloc_count))
abort ();
/* The .xt.lit.plt section has just been modified. This must /* The .xt.lit.plt section has just been modified. This must
happen before the code below which combines adjacent literal happen before the code below which combines adjacent literal
table entries, and the .xt.lit.plt contents have to be forced to table entries, and the .xt.lit.plt contents have to be forced to
@ -3282,6 +3274,14 @@ elf_xtensa_finish_dynamic_sections (bfd *output_bfd,
spltlittbl->flags &= ~SEC_HAS_CONTENTS; spltlittbl->flags &= ~SEC_HAS_CONTENTS;
} }
/* All the dynamic relocations have been emitted at this point.
Make sure the relocation sections are the correct size. */
if ((srelgot && srelgot->size != (sizeof (Elf32_External_Rela)
* srelgot->reloc_count))
|| (srelplt && srelplt->size != (sizeof (Elf32_External_Rela)
* srelplt->reloc_count)))
abort ();
/* Combine adjacent literal table entries. */ /* Combine adjacent literal table entries. */
BFD_ASSERT (! bfd_link_relocatable (info)); BFD_ASSERT (! bfd_link_relocatable (info));
sxtlit = bfd_get_section_by_name (output_bfd, ".xt.lit"); sxtlit = bfd_get_section_by_name (output_bfd, ".xt.lit");