bfd/
authorRichard Sandiford <rdsandiford@googlemail.com>
Thu, 19 Oct 2006 13:47:10 +0000 (13:47 +0000)
committerRichard Sandiford <rdsandiford@googlemail.com>
Thu, 19 Oct 2006 13:47:10 +0000 (13:47 +0000)
* elfxx-mips.c (sort_dynamic_relocs): Sort relocations against the
same symbol by increasing r_offset.
(sort_dynamic_relocs_64): Likewise.  Fix comparisons between very
large and very small symbol indexes.

ld/testsuite/
* ld-mips-elf/tlslib-o32-hidden.got: Sort relocations against the
same symbol in order of increasing r_offset.
* ld-mips-elf/tls-multi-got-1.got: Likewise.
* ld-mips-elf/tls-hidden3.r: Likewise.
* ld-mips-elf/tls-hidden4.r: Likewise.

bfd/ChangeLog
bfd/elfxx-mips.c
ld/testsuite/ChangeLog
ld/testsuite/ld-mips-elf/tls-hidden3.r
ld/testsuite/ld-mips-elf/tls-hidden4.r
ld/testsuite/ld-mips-elf/tls-multi-got-1.got
ld/testsuite/ld-mips-elf/tlslib-o32-hidden.got

index 7919e95..14cc5cb 100644 (file)
@@ -1,5 +1,12 @@
 2006-10-19  Richard Sandiford  <richard@codesourcery.com>
 
+       * elfxx-mips.c (sort_dynamic_relocs): Sort relocations against the
+       same symbol by increasing r_offset.
+       (sort_dynamic_relocs_64): Likewise.  Fix comparisons between very
+       large and very small symbol indexes.
+
+2006-10-19  Richard Sandiford  <richard@codesourcery.com>
+
        * elfxx-mips.c (_bfd_mips_elf_size_dynamic_sections): Add DT_DEBUG
        and DT_MIPS_RLD_MAP tags for position-independent executables.
        Do not add DT_DEBUG to shared libraries for any MIPS target.
index aea0273..33b0e43 100644 (file)
@@ -1692,11 +1692,20 @@ sort_dynamic_relocs (const void *arg1, const void *arg2)
 {
   Elf_Internal_Rela int_reloc1;
   Elf_Internal_Rela int_reloc2;
+  int diff;
 
   bfd_elf32_swap_reloc_in (reldyn_sorting_bfd, arg1, &int_reloc1);
   bfd_elf32_swap_reloc_in (reldyn_sorting_bfd, arg2, &int_reloc2);
 
-  return ELF32_R_SYM (int_reloc1.r_info) - ELF32_R_SYM (int_reloc2.r_info);
+  diff = ELF32_R_SYM (int_reloc1.r_info) - ELF32_R_SYM (int_reloc2.r_info);
+  if (diff != 0)
+    return diff;
+
+  if (int_reloc1.r_offset < int_reloc2.r_offset)
+    return -1;
+  if (int_reloc1.r_offset > int_reloc2.r_offset)
+    return 1;
+  return 0;
 }
 
 /* Like sort_dynamic_relocs, but used for elf64 relocations.  */
@@ -1714,8 +1723,16 @@ sort_dynamic_relocs_64 (const void *arg1 ATTRIBUTE_UNUSED,
   (*get_elf_backend_data (reldyn_sorting_bfd)->s->swap_reloc_in)
     (reldyn_sorting_bfd, arg2, int_reloc2);
 
-  return (ELF64_R_SYM (int_reloc1[0].r_info)
-         - ELF64_R_SYM (int_reloc2[0].r_info));
+  if (ELF64_R_SYM (int_reloc1[0].r_info) < ELF64_R_SYM (int_reloc2[0].r_info))
+    return -1;
+  if (ELF64_R_SYM (int_reloc1[0].r_info) > ELF64_R_SYM (int_reloc2[0].r_info))
+    return 1;
+
+  if (int_reloc1[0].r_offset < int_reloc2[0].r_offset)
+    return -1;
+  if (int_reloc1[0].r_offset > int_reloc2[0].r_offset)
+    return 1;
+  return 0;
 #else
   abort ();
 #endif
index da65ae6..3f72a2f 100644 (file)
@@ -1,5 +1,13 @@
 2006-10-19  Richard Sandiford  <richard@codesourcery.com>
 
+       * ld-mips-elf/tlslib-o32-hidden.got: Sort relocations against the
+       same symbol in order of increasing r_offset.
+       * ld-mips-elf/tls-multi-got-1.got: Likewise.
+       * ld-mips-elf/tls-hidden3.r: Likewise.
+       * ld-mips-elf/tls-hidden4.r: Likewise.
+
+2006-10-19  Richard Sandiford  <richard@codesourcery.com>
+
        * ld-mips-elf/multi-got-1.d: Remove DT_DEBUG tag.  Do not require
        a specific file offset for .dynamic.  Reduce DT_HASH by 8 to account
        for removed tag.
index 500e7b1..c0a23a5 100644 (file)
@@ -7,7 +7,7 @@ Relocation section '\.rel\.dyn' at offset .* contains 6 entries:
 # is that there is exactly one entry per GOT TLS slot.
 #
 00090020  0000002f R_MIPS_TLS_TPREL3
-0009002c  0000002f R_MIPS_TLS_TPREL3
 00090024  0000002f R_MIPS_TLS_TPREL3
 00090028  0000002f R_MIPS_TLS_TPREL3
+0009002c  0000002f R_MIPS_TLS_TPREL3
 00090030  .*03 R_MIPS_REL32      00000000   undef
index f6809b5..f4d36b0 100644 (file)
@@ -7,13 +7,13 @@ Relocation section '\.rel\.dyn' at offset .* contains .* entries:
 # important thing is that there is exactly one entry per GOT TLS slot
 # and that the addresses match those in the .got dump.
 #
-001d00d4  0000002f R_MIPS_TLS_TPREL3
-001d00d8  0000002f R_MIPS_TLS_TPREL3
-001d00d0  0000002f R_MIPS_TLS_TPREL3
-001d00cc  0000002f R_MIPS_TLS_TPREL3
-001c4088  0000002f R_MIPS_TLS_TPREL3
-001c408c  0000002f R_MIPS_TLS_TPREL3
 001c4080  0000002f R_MIPS_TLS_TPREL3
 001c4084  0000002f R_MIPS_TLS_TPREL3
+001c4088  0000002f R_MIPS_TLS_TPREL3
+001c408c  0000002f R_MIPS_TLS_TPREL3
+001d00cc  0000002f R_MIPS_TLS_TPREL3
+001d00d0  0000002f R_MIPS_TLS_TPREL3
+001d00d4  0000002f R_MIPS_TLS_TPREL3
+001d00d8  0000002f R_MIPS_TLS_TPREL3
 .* R_MIPS_REL32 .*
 #pass
index 1d5e216..de7b430 100644 (file)
@@ -4,14 +4,14 @@
 DYNAMIC RELOCATION RECORDS
 OFFSET   TYPE              VALUE 
 00000000 R_MIPS_NONE       \*ABS\*
-001495b0 R_MIPS_TLS_DTPMOD32  \*ABS\*
 0013f928 R_MIPS_TLS_DTPMOD32  \*ABS\*
-001495bc R_MIPS_TLS_DTPMOD32  tlsvar_gd
-001495c0 R_MIPS_TLS_DTPREL32  tlsvar_gd
+001495b0 R_MIPS_TLS_DTPMOD32  \*ABS\*
 0013f934 R_MIPS_TLS_DTPMOD32  tlsvar_gd
 0013f938 R_MIPS_TLS_DTPREL32  tlsvar_gd
-001495b8 R_MIPS_TLS_TPREL32  tlsvar_ie
+001495bc R_MIPS_TLS_DTPMOD32  tlsvar_gd
+001495c0 R_MIPS_TLS_DTPREL32  tlsvar_gd
 0013f930 R_MIPS_TLS_TPREL32  tlsvar_ie
+001495b8 R_MIPS_TLS_TPREL32  tlsvar_ie
 00143f5c R_MIPS_REL32      sym_1_9526
 #...
 00139bb0 R_MIPS_REL32      sym_2_8654
index 22d048a..0b5d7c5 100644 (file)
@@ -4,9 +4,9 @@
 DYNAMIC RELOCATION RECORDS
 OFFSET   TYPE              VALUE 
 00000000 R_MIPS_NONE       \*ABS\*
-000403bc R_MIPS_TLS_DTPMOD32  \*ABS\*
-000403b4 R_MIPS_TLS_DTPMOD32  \*ABS\*
 000403b0 R_MIPS_TLS_TPREL32  \*ABS\*
+000403b4 R_MIPS_TLS_DTPMOD32  \*ABS\*
+000403bc R_MIPS_TLS_DTPMOD32  \*ABS\*
 
 
 Contents of section .got: