| From f82863d797e461b936dff2b659a3aa65088ee87e Mon Sep 17 00:00:00 2001 |
| From: Max Filippov <jcmvbkbc@gmail.com> |
| Date: Sun, 22 Jul 2018 18:59:11 -0700 |
| Subject: [PATCH] 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. |
| |
| Signed-off-by: Max Filippov <jcmvbkbc@gmail.com> |
| Backported from: f82863d797e461b936dff2b659a3aa65088ee87e |
| --- |
| bfd/elf32-xtensa.c | 22 +++++++++++----------- |
| 1 file changed, 11 insertions(+), 11 deletions(-) |
| |
| diff --git a/bfd/elf32-xtensa.c b/bfd/elf32-xtensa.c |
| index a4b046e445f1..cf085b7b0751 100644 |
| --- a/bfd/elf32-xtensa.c |
| +++ b/bfd/elf32-xtensa.c |
| @@ -3156,7 +3156,7 @@ elf_xtensa_finish_dynamic_sections (bfd *output_bfd, |
| { |
| struct elf_xtensa_link_hash_table *htab; |
| bfd *dynobj; |
| - asection *sdyn, *srelplt, *sgot, *sxtlit, *sgotloc; |
| + asection *sdyn, *srelplt, *srelgot, *sgot, *sxtlit, *sgotloc; |
| Elf32_External_Dyn *dyncon, *dynconend; |
| int num_xtlit_entries = 0; |
| |
| @@ -3186,15 +3186,15 @@ elf_xtensa_finish_dynamic_sections (bfd *output_bfd, |
| } |
| |
| srelplt = htab->elf.srelplt; |
| + srelgot = htab->elf.srelgot; |
| if (srelplt && srelplt->size != 0) |
| { |
| - asection *sgotplt, *srelgot, *spltlittbl; |
| + asection *sgotplt, *spltlittbl; |
| int chunk, plt_chunks, plt_entries; |
| Elf_Internal_Rela irela; |
| bfd_byte *loc; |
| unsigned rtld_reloc; |
| |
| - srelgot = htab->elf.srelgot; |
| spltlittbl = htab->spltlittbl; |
| BFD_ASSERT (srelgot != NULL && spltlittbl != NULL); |
| |
| @@ -3260,14 +3260,6 @@ elf_xtensa_finish_dynamic_sections (bfd *output_bfd, |
| 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 |
| happen before the code below which combines adjacent literal |
| 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; |
| } |
| |
| + /* 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. */ |
| BFD_ASSERT (! bfd_link_relocatable (info)); |
| sxtlit = bfd_get_section_by_name (output_bfd, ".xt.lit"); |
| -- |
| 2.11.0 |
| |