2000-07-09 Koundinya K <kk@ddeorg.soft.net>
authorUlf Carlsson <ulfc@engr.sgi.com>
Sun, 9 Jul 2000 13:48:21 +0000 (13:48 +0000)
committerUlf Carlsson <ulfc@engr.sgi.com>
Sun, 9 Jul 2000 13:48:21 +0000 (13:48 +0000)
        * elf32-mips.c (sort_dynamic_relocs): New Function.
        (_bfd_mips_elf_finish_dynamic_sections): Call sort_dynamic_relocs
via qsort to sort the dynamic relocations in increasing r_symndx
value.

bfd/ChangeLog
bfd/elf32-mips.c

index 805a3d79ba75a97afa8ab4fa9e2f649a0289072c..c1ebe2a6b9b3a5a80cc9a9ccd9e29702a21276bb 100644 (file)
@@ -1,3 +1,10 @@
+2000-07-09  Koundinya K  <kk@ddeorg.soft.net>
+
+        * elf32-mips.c (sort_dynamic_relocs): New Function.
+        (_bfd_mips_elf_finish_dynamic_sections): Call sort_dynamic_relocs
+       via qsort to sort the dynamic relocations in increasing r_symndx
+       value.
+       
 2000-07-09  Alan Modra  <alan@linuxcare.com.au>
 
        * elf64-hppa.c (elf64_hppa_dyn_hash_table_init): Add
index 39b9ae233fe559c54770df46043930cf51eb4703..a0512acc1589a4116a543f6ee5d7e77cf4bdf6f2 100644 (file)
@@ -195,6 +195,8 @@ static void mips_elf_allocate_dynamic_relocations
   PARAMS ((bfd *, unsigned int));
 static boolean mips_elf_stub_section_p 
   PARAMS ((bfd *, asection *));
+static int sort_dynamic_relocs
+  PARAMS ((const void *, const void *));
 
 /* The level of IRIX compatibility we're striving for.  */
 
@@ -204,6 +206,9 @@ typedef enum {
   ict_irix6
 } irix_compat_t;
 
+/* This will be used when we sort the dynamic relocation records.  */
+static bfd *reldyn_sorting_bfd;
+
 /* Nonzero if ABFD is using the N32 ABI.  */
 
 #define ABI_N32_P(abfd) \
@@ -5141,6 +5146,26 @@ _bfd_mips_elf_final_link (abfd, info)
   return true;
 }
 
+/* This function is called via qsort() to sort the dynamic relocation
+   entries by increasing r_symndx value.  */
+
+static int
+sort_dynamic_relocs (arg1,arg2)
+        const PTR arg1;
+        const PTR arg2;
+{
+  const Elf32_External_Rel *ext_reloc1 = (const Elf32_External_Rel *) arg1;
+  const Elf32_External_Rel *ext_reloc2 = (const Elf32_External_Rel *) arg2;
+
+  Elf_Internal_Rel int_reloc1;
+  Elf_Internal_Rel int_reloc2;
+
+  bfd_elf32_swap_reloc_in(reldyn_sorting_bfd, ext_reloc1, &int_reloc1);
+  bfd_elf32_swap_reloc_in(reldyn_sorting_bfd, ext_reloc2, &int_reloc2);
+
+  return (ELF32_R_SYM(int_reloc1.r_info) - ELF32_R_SYM(int_reloc2.r_info));
+}
+
 /* Returns the GOT section for ABFD.  */
 
 static asection *
@@ -8837,6 +8862,23 @@ _bfd_mips_elf_finish_dynamic_sections (output_bfd, info)
          }
       }
 
+    /* We need to sort the entries of the dynamic relocation section.  */
+
+    if (!ABI_64_P (output_bfd))
+      {
+            asection *reldyn;
+
+            reldyn = bfd_get_section_by_name (dynobj,
+                                     MIPS_ELF_REL_DYN_SECTION_NAME (dynobj));
+            if (reldyn != NULL && reldyn->reloc_count > 2)
+              {
+                reldyn_sorting_bfd = output_bfd;
+                qsort ((Elf32_External_Rel *) reldyn->contents + 1,
+                       (size_t) reldyn->reloc_count - 1,
+                       sizeof (Elf32_External_Rel), sort_dynamic_relocs);
+              }
+      }
+
     /* Clean up a first relocation in .rel.dyn.  */
     s = bfd_get_section_by_name (dynobj, 
                                 MIPS_ELF_REL_DYN_SECTION_NAME (dynobj));