aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bfd/ChangeLog7
-rw-r--r--bfd/elfxx-mips.c23
-rw-r--r--ld/testsuite/ChangeLog8
-rw-r--r--ld/testsuite/ld-mips-elf/tls-hidden3.r2
-rw-r--r--ld/testsuite/ld-mips-elf/tls-hidden4.r12
-rw-r--r--ld/testsuite/ld-mips-elf/tls-multi-got-1.got8
-rw-r--r--ld/testsuite/ld-mips-elf/tlslib-o32-hidden.got4
7 files changed, 48 insertions, 16 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 7919e95..14cc5cb 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -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.
diff --git a/bfd/elfxx-mips.c b/bfd/elfxx-mips.c
index aea0273..33b0e43 100644
--- a/bfd/elfxx-mips.c
+++ b/bfd/elfxx-mips.c
@@ -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
diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog
index da65ae6..3f72a2f 100644
--- a/ld/testsuite/ChangeLog
+++ b/ld/testsuite/ChangeLog
@@ -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.
diff --git a/ld/testsuite/ld-mips-elf/tls-hidden3.r b/ld/testsuite/ld-mips-elf/tls-hidden3.r
index 500e7b1..c0a23a5 100644
--- a/ld/testsuite/ld-mips-elf/tls-hidden3.r
+++ b/ld/testsuite/ld-mips-elf/tls-hidden3.r
@@ -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
diff --git a/ld/testsuite/ld-mips-elf/tls-hidden4.r b/ld/testsuite/ld-mips-elf/tls-hidden4.r
index f6809b5..f4d36b0 100644
--- a/ld/testsuite/ld-mips-elf/tls-hidden4.r
+++ b/ld/testsuite/ld-mips-elf/tls-hidden4.r
@@ -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
diff --git a/ld/testsuite/ld-mips-elf/tls-multi-got-1.got b/ld/testsuite/ld-mips-elf/tls-multi-got-1.got
index 1d5e216..de7b430 100644
--- a/ld/testsuite/ld-mips-elf/tls-multi-got-1.got
+++ b/ld/testsuite/ld-mips-elf/tls-multi-got-1.got
@@ -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
diff --git a/ld/testsuite/ld-mips-elf/tlslib-o32-hidden.got b/ld/testsuite/ld-mips-elf/tlslib-o32-hidden.got
index 22d048a..0b5d7c5 100644
--- a/ld/testsuite/ld-mips-elf/tlslib-o32-hidden.got
+++ b/ld/testsuite/ld-mips-elf/tlslib-o32-hidden.got
@@ -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: