From 6870500c0404a6501f0a21fdbca6ce2695c6ca0c Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Thu, 19 Oct 2006 13:47:10 +0000 Subject: [PATCH] bfd/ * 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 | 7 ++++++ bfd/elfxx-mips.c | 23 ++++++++++++++++--- ld/testsuite/ChangeLog | 8 +++++++ ld/testsuite/ld-mips-elf/tls-hidden3.r | 2 +- ld/testsuite/ld-mips-elf/tls-hidden4.r | 12 +++++----- ld/testsuite/ld-mips-elf/tls-multi-got-1.got | 8 +++---- .../ld-mips-elf/tlslib-o32-hidden.got | 4 ++-- 7 files changed, 48 insertions(+), 16 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 7919e9537e..14cc5cbeed 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,10 @@ +2006-10-19 Richard Sandiford + + * 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 * elfxx-mips.c (_bfd_mips_elf_size_dynamic_sections): Add DT_DEBUG diff --git a/bfd/elfxx-mips.c b/bfd/elfxx-mips.c index aea0273196..33b0e431a1 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 da65ae64fa..3f72a2fc5a 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2006-10-19 Richard Sandiford + + * 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 * ld-mips-elf/multi-got-1.d: Remove DT_DEBUG tag. Do not require diff --git a/ld/testsuite/ld-mips-elf/tls-hidden3.r b/ld/testsuite/ld-mips-elf/tls-hidden3.r index 500e7b1707..c0a23a5a5f 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 f6809b5280..f4d36b09fa 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 1d5e216c05..de7b43087b 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 22d048ad33..0b5d7c59c4 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: