mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-26 05:47:26 +08:00
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:
@ -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
|
||||||
|
@ -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");
|
||||||
|
Reference in New Issue
Block a user