2005-05-28 David Daney <ddaney@avtrex.com>
authorDaniel Jacobowitz <drow@false.org>
Sat, 28 May 2005 22:00:27 +0000 (22:00 +0000)
committerDaniel Jacobowitz <drow@false.org>
Sat, 28 May 2005 22:00:27 +0000 (22:00 +0000)
* elfxx-mips.c (_bfd_mips_elf_finish_dynamic_sections):  Move
calculation of DT_RELSZ to occur after all dynamic relocations
are created.

bfd/ChangeLog
bfd/elfxx-mips.c

index 32f83dc7c135d1d9c5396e021afc8d42c1c62fb5..86ae224bd46f1740c6d8660cfbb0564f7eea5563 100644 (file)
@@ -1,3 +1,9 @@
+2005-05-28  David Daney  <ddaney@avtrex.com>
+
+       * elfxx-mips.c (_bfd_mips_elf_finish_dynamic_sections):  Move
+       calculation of DT_RELSZ to occur after all dynamic relocations
+       are created.
+
 2005-05-28  Eli Zaretskii  <eliz@gnu.org>
 
        * configure.in: Add snprintf and vsnprintf to AC_CHECK_DECLS.
index 55d5f75f23224e087f4496e4444aaa4fe7167904..9bae5d58378349261c9beef049416c1119d18270 100644 (file)
@@ -7696,18 +7696,6 @@ _bfd_mips_elf_finish_dynamic_sections (bfd *output_bfd,
              dyn.d_un.d_ptr = s->vma;
              break;
 
-           case DT_RELSZ:
-             /* Reduce DT_RELSZ to account for any relocations we
-                decided not to make.  This is for the n64 irix rld,
-                which doesn't seem to apply any relocations if there
-                are trailing null entries.  */
-             s = mips_elf_rel_dyn_section (dynobj, FALSE);
-             dyn.d_un.d_val = (s->reloc_count
-                               * (ABI_64_P (output_bfd)
-                                  ? sizeof (Elf64_Mips_External_Rel)
-                                  : sizeof (Elf32_External_Rel)));
-             break;
-
            default:
              swap_out_p = FALSE;
              break;
@@ -7769,6 +7757,55 @@ _bfd_mips_elf_finish_dynamic_sections (bfd *output_bfd,
        }
     }
 
+  /* The generation of dynamic relocations for the non-primary gots
+     adds more dynamic relocations.  We cannot count them until
+     here.  */
+
+  if (elf_hash_table (info)->dynamic_sections_created)
+    {
+      bfd_byte *b;
+      bfd_boolean swap_out_p;
+
+      BFD_ASSERT (sdyn != NULL);
+
+      for (b = sdyn->contents;
+          b < sdyn->contents + sdyn->size;
+          b += MIPS_ELF_DYN_SIZE (dynobj))
+       {
+         Elf_Internal_Dyn dyn;
+         asection *s;
+
+         /* Read in the current dynamic entry.  */
+         (*get_elf_backend_data (dynobj)->s->swap_dyn_in) (dynobj, b, &dyn);
+
+         /* Assume that we're going to modify it and write it out.  */
+         swap_out_p = TRUE;
+
+         switch (dyn.d_tag)
+           {
+           case DT_RELSZ:
+             /* Reduce DT_RELSZ to account for any relocations we
+                decided not to make.  This is for the n64 irix rld,
+                which doesn't seem to apply any relocations if there
+                are trailing null entries.  */
+             s = mips_elf_rel_dyn_section (dynobj, FALSE);
+             dyn.d_un.d_val = (s->reloc_count
+                               * (ABI_64_P (output_bfd)
+                                  ? sizeof (Elf64_Mips_External_Rel)
+                                  : sizeof (Elf32_External_Rel)));
+             break;
+
+           default:
+             swap_out_p = FALSE;
+             break;
+           }
+
+         if (swap_out_p)
+           (*get_elf_backend_data (dynobj)->s->swap_dyn_out)
+             (dynobj, &dyn, b);
+       }
+    }
+
   {
     asection *s;
     Elf32_compact_rel cpt;