xtensa: move dynamic relocations sections consistency check
authorMax Filippov <jcmvbkbc@gmail.com>
Mon, 23 Jul 2018 01:59:11 +0000 (18:59 -0700)
committerMax Filippov <jcmvbkbc@gmail.com>
Mon, 23 Jul 2018 19:03:56 +0000 (12:03 -0700)
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.

bfd/ChangeLog
bfd/elf32-xtensa.c

index 3bdd2aa254bc990857922f054dad3e09f3a9a14d..370289d38315ded89bba3680d27ba538c87467b5 100644 (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>
 
        * elf32-xtensa.c (shrink_dynamic_reloc_sections): Shrink dynamic
index a4b046e445f1d37e2c015c888083d415b1ec7ae7..cf085b7b07516fa480144884a3be0d84952e2be8 100644 (file)
@@ -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");