mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-22 11:00:01 +08:00
Fix Thumb-2 BL detection
2016-07-01 Thomas Preud'homme <thomas.preudhomme@arm.com> bfd/ * elf32-arm.c (using_thumb2_bl): New function. (arm_type_of_stub): Declare thumb2 variable together and change type to bfd_boolean. Use using_thumb2_bl () to determine whether THM_MAX_FWD_BRANCH_OFFSET or THM2_MAX_FWD_BRANCH_OFFSET should be checked for BL range. (elf32_arm_final_link_relocate): Use using_thumb2_bl () to determine the bit size of BL offset. ld/ * testsuite/ld-arm/arm-elf.exp (Thumb-2 BL): Assemble for ARMv7. (Thumb-2 BL on ARMv6-M): New testcase. * testsuite/ld-arm/thumb2-bl.d: Do not try to match testcase filename. * testsuite/ld-arm/thumb2-bl.s: Do not select architecture.
This commit is contained in:
@ -1,3 +1,13 @@
|
|||||||
|
2016-07-01 Thomas Preud'homme <thomas.preudhomme@arm.com>
|
||||||
|
|
||||||
|
* elf32-arm.c (using_thumb2_bl): New function.
|
||||||
|
(arm_type_of_stub): Declare thumb2 variable together and change type
|
||||||
|
to bfd_boolean. Use using_thumb2_bl () to determine whether
|
||||||
|
THM_MAX_FWD_BRANCH_OFFSET or THM2_MAX_FWD_BRANCH_OFFSET should be
|
||||||
|
checked for BL range.
|
||||||
|
(elf32_arm_final_link_relocate): Use using_thumb2_bl () to determine
|
||||||
|
the bit size of BL offset.
|
||||||
|
|
||||||
2016-06-29 Nick Clifton <nickc@redhat.com>
|
2016-06-29 Nick Clifton <nickc@redhat.com>
|
||||||
|
|
||||||
* elfnn-aarch64.c (is_aarch64_mapping_symbol): New function.
|
* elfnn-aarch64.c (is_aarch64_mapping_symbol): New function.
|
||||||
|
@ -3569,6 +3569,24 @@ using_thumb2 (struct elf32_arm_link_hash_table *globals)
|
|||||||
|| arch == TAG_CPU_ARCH_V8M_MAIN);
|
|| arch == TAG_CPU_ARCH_V8M_MAIN);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Determine whether Thumb-2 BL instruction is available. */
|
||||||
|
|
||||||
|
static bfd_boolean
|
||||||
|
using_thumb2_bl (struct elf32_arm_link_hash_table *globals)
|
||||||
|
{
|
||||||
|
int arch =
|
||||||
|
bfd_elf_get_obj_attr_int (globals->obfd, OBJ_ATTR_PROC, Tag_CPU_arch);
|
||||||
|
|
||||||
|
/* Force return logic to be reviewed for each new architecture. */
|
||||||
|
BFD_ASSERT (arch <= TAG_CPU_ARCH_V8
|
||||||
|
|| arch == TAG_CPU_ARCH_V8M_BASE
|
||||||
|
|| arch == TAG_CPU_ARCH_V8M_MAIN);
|
||||||
|
|
||||||
|
/* Architecture was introduced after ARMv6T2 (eg. ARMv6-M). */
|
||||||
|
return (arch == TAG_CPU_ARCH_V6T2
|
||||||
|
|| arch >= TAG_CPU_ARCH_V7);
|
||||||
|
}
|
||||||
|
|
||||||
/* Create .plt, .rel(a).plt, .got, .got.plt, .rel(a).got, .dynbss, and
|
/* Create .plt, .rel(a).plt, .got, .got.plt, .rel(a).got, .dynbss, and
|
||||||
.rel(a).bss sections in DYNOBJ, and set up shortcuts to them in our
|
.rel(a).bss sections in DYNOBJ, and set up shortcuts to them in our
|
||||||
hash table. */
|
hash table. */
|
||||||
@ -3823,8 +3841,7 @@ arm_type_of_stub (struct bfd_link_info *info,
|
|||||||
bfd_signed_vma branch_offset;
|
bfd_signed_vma branch_offset;
|
||||||
unsigned int r_type;
|
unsigned int r_type;
|
||||||
struct elf32_arm_link_hash_table * globals;
|
struct elf32_arm_link_hash_table * globals;
|
||||||
int thumb2;
|
bfd_boolean thumb2, thumb2_bl, thumb_only;
|
||||||
int thumb_only;
|
|
||||||
enum elf32_arm_stub_type stub_type = arm_stub_none;
|
enum elf32_arm_stub_type stub_type = arm_stub_none;
|
||||||
int use_plt = 0;
|
int use_plt = 0;
|
||||||
enum arm_st_branch_type branch_type = *actual_branch_type;
|
enum arm_st_branch_type branch_type = *actual_branch_type;
|
||||||
@ -3839,8 +3856,8 @@ arm_type_of_stub (struct bfd_link_info *info,
|
|||||||
return stub_type;
|
return stub_type;
|
||||||
|
|
||||||
thumb_only = using_thumb_only (globals);
|
thumb_only = using_thumb_only (globals);
|
||||||
|
|
||||||
thumb2 = using_thumb2 (globals);
|
thumb2 = using_thumb2 (globals);
|
||||||
|
thumb2_bl = using_thumb2_bl (globals);
|
||||||
|
|
||||||
/* Determine where the call point is. */
|
/* Determine where the call point is. */
|
||||||
location = (input_sec->output_offset
|
location = (input_sec->output_offset
|
||||||
@ -3906,10 +3923,10 @@ arm_type_of_stub (struct bfd_link_info *info,
|
|||||||
but only if this call is not through a PLT entry. Indeed,
|
but only if this call is not through a PLT entry. Indeed,
|
||||||
PLT stubs handle mode switching already.
|
PLT stubs handle mode switching already.
|
||||||
*/
|
*/
|
||||||
if ((!thumb2
|
if ((!thumb2_bl
|
||||||
&& (branch_offset > THM_MAX_FWD_BRANCH_OFFSET
|
&& (branch_offset > THM_MAX_FWD_BRANCH_OFFSET
|
||||||
|| (branch_offset < THM_MAX_BWD_BRANCH_OFFSET)))
|
|| (branch_offset < THM_MAX_BWD_BRANCH_OFFSET)))
|
||||||
|| (thumb2
|
|| (thumb2_bl
|
||||||
&& (branch_offset > THM2_MAX_FWD_BRANCH_OFFSET
|
&& (branch_offset > THM2_MAX_FWD_BRANCH_OFFSET
|
||||||
|| (branch_offset < THM2_MAX_BWD_BRANCH_OFFSET)))
|
|| (branch_offset < THM2_MAX_BWD_BRANCH_OFFSET)))
|
||||||
|| (thumb2
|
|| (thumb2
|
||||||
@ -9838,6 +9855,7 @@ elf32_arm_final_link_relocate (reloc_howto_type * howto,
|
|||||||
bfd_signed_vma signed_check;
|
bfd_signed_vma signed_check;
|
||||||
int bitsize;
|
int bitsize;
|
||||||
const int thumb2 = using_thumb2 (globals);
|
const int thumb2 = using_thumb2 (globals);
|
||||||
|
const int thumb2_bl = using_thumb2_bl (globals);
|
||||||
|
|
||||||
/* A branch to an undefined weak symbol is turned into a jump to
|
/* A branch to an undefined weak symbol is turned into a jump to
|
||||||
the next instruction unless a PLT entry will be created.
|
the next instruction unless a PLT entry will be created.
|
||||||
@ -10014,7 +10032,7 @@ elf32_arm_final_link_relocate (reloc_howto_type * howto,
|
|||||||
this relocation according to whether we're relocating for
|
this relocation according to whether we're relocating for
|
||||||
Thumb-2 or not. */
|
Thumb-2 or not. */
|
||||||
bitsize = howto->bitsize;
|
bitsize = howto->bitsize;
|
||||||
if (!thumb2)
|
if (!thumb2_bl)
|
||||||
bitsize -= 2;
|
bitsize -= 2;
|
||||||
reloc_signed_max = (1 << (bitsize - 1)) - 1;
|
reloc_signed_max = (1 << (bitsize - 1)) - 1;
|
||||||
reloc_signed_min = ~reloc_signed_max;
|
reloc_signed_min = ~reloc_signed_max;
|
||||||
|
@ -1,3 +1,10 @@
|
|||||||
|
2016-07-01 Thomas Preud'homme <thomas.preudhomme@arm.com>
|
||||||
|
|
||||||
|
* testsuite/ld-arm/arm-elf.exp (Thumb-2 BL): Assemble for ARMv7.
|
||||||
|
(Thumb-2 BL on ARMv6-M): New testcase.
|
||||||
|
* testsuite/ld-arm/thumb2-bl.d: Do not try to match testcase filename.
|
||||||
|
* testsuite/ld-arm/thumb2-bl.s: Do not select architecture.
|
||||||
|
|
||||||
2016-07-01 Tristan Gingold <gingold@adacore.com>
|
2016-07-01 Tristan Gingold <gingold@adacore.com>
|
||||||
|
|
||||||
* NEWS: Add marker for 2.27.
|
* NEWS: Add marker for 2.27.
|
||||||
|
@ -604,9 +604,12 @@ set armeabitests_nonacl {
|
|||||||
{{objdump -d fix-arm1176-off.d}}
|
{{objdump -d fix-arm1176-off.d}}
|
||||||
"fix-arm1176-6"}
|
"fix-arm1176-6"}
|
||||||
|
|
||||||
{"Thumb-2 BL" "-Ttext 0x1000 --section-start .foo=0x1001000" "" "" {thumb2-bl.s}
|
{"Thumb-2 BL" "-Ttext 0x1000 --section-start .foo=0x1001000" "" "-march=armv7" {thumb2-bl.s}
|
||||||
{{objdump -dr thumb2-bl.d}}
|
{{objdump -dr thumb2-bl.d}}
|
||||||
"thumb2-bl"}
|
"thumb2-bl"}
|
||||||
|
{"Thumb-2 BL on ARMv6-M" "-Ttext 0x1000 --section-start .foo=0x1001000" "" "-march=armv6-m" {thumb2-bl.s}
|
||||||
|
{{objdump -dr thumb2-bl.d}}
|
||||||
|
"thumb2-armv6m-bl"}
|
||||||
{"Thumb-2 Interworked branch" "-T arm.ld" "" "" {thumb2-b-interwork.s}
|
{"Thumb-2 Interworked branch" "-T arm.ld" "" "" {thumb2-b-interwork.s}
|
||||||
{{objdump -dr thumb2-b-interwork.d}}
|
{{objdump -dr thumb2-b-interwork.d}}
|
||||||
"thumb2-b-interwork"}
|
"thumb2-b-interwork"}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
|
|
||||||
.*thumb2-bl: file format elf32-.*arm.*
|
.*: file format elf32-.*arm.*
|
||||||
|
|
||||||
Disassembly of section .text:
|
Disassembly of section .text:
|
||||||
|
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
@ Test to ensure that a Thumb-2 BL works with an offset that is
|
@ Test to ensure that a Thumb-2 BL works with an offset that is
|
||||||
@ not permissable for Thumb-1.
|
@ not permissable for Thumb-1.
|
||||||
|
|
||||||
.arch armv7
|
|
||||||
.global _start
|
.global _start
|
||||||
.syntax unified
|
.syntax unified
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user