From 12352d3f854285aaaecf6bc89df80e6247968a63 Mon Sep 17 00:00:00 2001 From: Paul Brook Date: Tue, 31 May 2011 13:37:27 +0000 Subject: [PATCH] 2011-05-31 Paul Brook bfd/ * elf32-arm.c (arm_stub_is_thumb): Add arm_stub_long_branch_v4t_thumb_tls_pic. (elf32_arm_final_link_relocate): TLS stubs are always ARM. Handle Thumb stubs. ld/testsuite/ * ld-arm/tls-longplt.d: Update expected output. * ld-arm/tls-thumb1.d: Ditto. --- bfd/ChangeLog | 7 +++++++ bfd/elf32-arm.c | 23 ++++++++++++++++++----- ld/testsuite/ChangeLog | 5 +++++ ld/testsuite/ld-arm/tls-longplt.d | 2 +- ld/testsuite/ld-arm/tls-thumb1.d | 4 ++-- 5 files changed, 33 insertions(+), 8 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index a66e8964ea..8cd4935eff 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,10 @@ +2011-05-31 Paul Brook + + * elf32-arm.c (arm_stub_is_thumb): Add + arm_stub_long_branch_v4t_thumb_tls_pic. + (elf32_arm_final_link_relocate): TLS stubs are always ARM. + Handle Thumb stubs. + 2011-05-27 Nick Clifton PR binutils/12710 diff --git a/bfd/elf32-arm.c b/bfd/elf32-arm.c index 671a20996e..611e08ed14 100644 --- a/bfd/elf32-arm.c +++ b/bfd/elf32-arm.c @@ -3427,6 +3427,7 @@ arm_stub_is_thumb (enum elf32_arm_stub_type stub_type) case arm_stub_long_branch_v4t_thumb_arm: case arm_stub_short_branch_v4t_thumb_arm: case arm_stub_long_branch_v4t_thumb_arm_pic: + case arm_stub_long_branch_v4t_thumb_tls_pic: case arm_stub_long_branch_thumb_only_pic: return TRUE; case arm_stub_none: @@ -9304,6 +9305,9 @@ elf32_arm_final_link_relocate (reloc_howto_type * howto, || ELF32_R_TYPE(rel->r_info) == R_ARM_THM_TLS_CALL) { bfd_signed_vma offset; + /* TLS stubs are arm mode. The original symbol is a + data object, so branch_type is bogus. */ + branch_type = ST_BRANCH_TO_ARM; enum elf32_arm_stub_type stub_type = arm_type_of_stub (info, input_section, rel, st_type, &branch_type, @@ -9348,16 +9352,25 @@ elf32_arm_final_link_relocate (reloc_howto_type * howto, input_section->output_offset + rel->r_offset + 4); - /* Round up the offset to a word boundary */ - offset = (offset + 2) & ~2; + if (stub_type != arm_stub_none + && arm_stub_is_thumb (stub_type)) + { + lower_insn = 0xd000; + } + else + { + lower_insn = 0xc000; + /* Round up the offset to a word boundary */ + offset = (offset + 2) & ~2; + } + neg = offset < 0; upper_insn = (0xf000 | ((offset >> 12) & 0x3ff) | (neg << 10)); - lower_insn = (0xc000 - | (((!((offset >> 23) & 1)) ^ neg) << 13) + lower_insn |= (((!((offset >> 23) & 1)) ^ neg) << 13) | (((!((offset >> 22) & 1)) ^ neg) << 11) - | ((offset >> 1) & 0x7ff)); + | ((offset >> 1) & 0x7ff); bfd_put_16 (input_bfd, upper_insn, hit_data); bfd_put_16 (input_bfd, lower_insn, hit_data + 2); return bfd_reloc_ok; diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index d3bafcc552..a652cdeee0 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-05-31 Paul Brook + + * ld-arm/tls-longplt.d: Update expected output. + * ld-arm/tls-thumb1.d: Ditto. + 2011-05-26 H.J. Lu PR ld/12809 diff --git a/ld/testsuite/ld-arm/tls-longplt.d b/ld/testsuite/ld-arm/tls-longplt.d index 8729e74206..175c56179a 100644 --- a/ld/testsuite/ld-arm/tls-longplt.d +++ b/ld/testsuite/ld-arm/tls-longplt.d @@ -47,7 +47,7 @@ Disassembly of section .foo: 4001018: e1a00000 nop ; .* 400101c: fc00f2a0 .word 0xfc00f2a0 4001020: 4801 ldr r0, \[pc, #4\] ; .* - 4001022: f000 e80a blx 4001038 .* + 4001022: f000 f809 bl 4001038 .* 4001026: 46c0 nop ; .* 4001028: fc00f291 .word 0xfc00f291 400102c: 00000000 .word 0x00000000 diff --git a/ld/testsuite/ld-arm/tls-thumb1.d b/ld/testsuite/ld-arm/tls-thumb1.d index 26b65bb52c..ad2a512c94 100644 --- a/ld/testsuite/ld-arm/tls-thumb1.d +++ b/ld/testsuite/ld-arm/tls-thumb1.d @@ -31,7 +31,7 @@ Disassembly of section .text: 81b0: e1a00000 nop ; .* 81b4: 000080c0 .word 0x000080c0 81b8: 4801 ldr r0, \[pc, #4\] ; .* - 81ba: f000 e806 blx 81c8 .* + 81ba: f000 f805 bl 81c8 .* 81be: 46c0 nop ; .* 81c0: 000080b1 .word 0x000080b1 81c4: 00000000 .word 0x00000000 @@ -55,7 +55,7 @@ Disassembly of section .foo: 4001018: e1a00000 nop ; .* 400101c: fc00f260 .word 0xfc00f260 4001020: 4801 ldr r0, \[pc, #4\] ; .* - 4001022: f000 e80c blx 400103c .* + 4001022: f000 f80b bl 400103c .* 4001026: 46c0 nop ; .* 4001028: fc00f249 .word 0xfc00f249 400102c: 00000000 .word 0x00000000