[PATCH][GOLD] Handle bit-1 of THUMB BLX target address correctly.

Ian Lance Taylor iant@google.com
Mon Mar 22 23:13:00 GMT 2010


"Doug Kwan (關振德)" <dougkwan@google.com> writes:

> 2010-03-22  Doug Kwan  <dougkwan@google.com>
>
>         * arm.cc (Arm_relocate_functions::abs8,
>         Arm_relocate_functions::abs16): Use correct check for overflow
>         specified in the ARM ELF specs.
>         (Arm_relocate_functions): thumb_branch_common.  Handle bit 1 of branch
>         target of a BLX instruction specially.
>         (Reloc_stub::stub_type_for_reloc): Ditto.
>         (Relocate::relocate): Use symbolic names instead of numeric relocation
>         codes to report error.
>         (Target_arm::do_relox): Reduce default stub-group size for Cortex-A8
>         workaround.
>         * testsuite/Makefile.am (check_DATA): add thumb_blx_in_range.stdout,
>         thumb_blx_out_of_range.stdout, thumb2_blx_in_range.stdout and
>         thumb2_blx_out_of_range.stdout
>         (thumb_bl_out_of_range, thumb_bl_out_of_range.o,
>         thumb2_bl_out_of_range, thumb2_bl_out_of_range.o): Fix dependenices.
>         (thumb_blx_in_range.stdout, thumb_blx_in_range, thumb_blx_in_range.o,
>         thumb_blx_out_of_range.stdout, thumb_blx_out_of_range,
>         thumb_blx_out_of_range.o, thumb2_blx_in_range.stdout,
>         thumb2_blx_in_range, thumb2_blx_in_range.o,
>         thumb2_blx_out_of_range.stdout, thumb2_blx_out_of_range,
>         thumb2_blx_out_of_range.o): New rules.
>         (MOSTLYCLEANFILES): Add thumb_blx_in_range, thumb_blx_out_of_range,
>         thumb2_blx_in_range and thumb2_blx_out_of_range.
>         * testsuite/Makefile.in: Regenerate.
>         * arm_branch_in_range.sh: Add tests for THUMB BLX.
>         * testsuite/thumb_blx_in_range.s: New file.
>         * testsuite/thumb_blx_out_of_range.s: New file.

> @@ -4225,10 +4240,15 @@ Reloc_stub::stub_type_for_reloc(
>        thumb_only = little_endian_target->using_thumb_only();
>      }
>  
> -  int64_t branch_offset = (int64_t)destination - location;
> -
> +  int64_t branch_offset;
>    if (r_type == elfcpp::R_ARM_THM_CALL || r_type == elfcpp::R_ARM_THM_JUMP24)
>      {
> +      // For THUMB BLX instruction, bit 1 of target comes from bit 1 of the
> +      // base address (instruction address + 4).
> +      if ((r_type == elfcpp::R_ARM_THM_CALL) && may_use_blx && !target_is_thumb)
> +	destination = utils::bit_select(destination, location, 0x2);
> +      branch_offset = (int64_t)destination - location;

Use static_cast<int64_t> here.

> @@ -4309,6 +4329,7 @@ Reloc_stub::stub_type_for_reloc(
>  	   || r_type == elfcpp::R_ARM_JUMP24
>  	   || r_type == elfcpp::R_ARM_PLT32)
>      {
> +      branch_offset = (int64_t)destination - location;

Here too.


This is OK with those changes.

Thanks.

Ian



More information about the Binutils mailing list