mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-21 18:39:34 +08:00
Fix handling of R_ARM_THM_PC11
This commit is contained in:
@ -1,3 +1,8 @@
|
|||||||
|
2002-09-12 Nick Clifton <nickc@redhat.com>
|
||||||
|
|
||||||
|
* elf32-arm.h (elf32_arm_final_link_relocate): Fix handling of
|
||||||
|
R_ARM_THM_PC11.
|
||||||
|
|
||||||
2002-09-11 Andrew Haley <aph@cambridge.redhat.com>
|
2002-09-11 Andrew Haley <aph@cambridge.redhat.com>
|
||||||
|
|
||||||
* elf.c (_bfd_elf_find_nearest_line): Check functionname_ptr and
|
* elf.c (_bfd_elf_find_nearest_line): Check functionname_ptr and
|
||||||
|
@ -1501,33 +1501,36 @@ elf32_arm_final_link_relocate (howto, input_bfd, output_bfd,
|
|||||||
case R_ARM_THM_PC11:
|
case R_ARM_THM_PC11:
|
||||||
/* Thumb B (branch) instruction). */
|
/* Thumb B (branch) instruction). */
|
||||||
{
|
{
|
||||||
bfd_vma relocation;
|
bfd_signed_vma relocation;
|
||||||
bfd_signed_vma reloc_signed_max = (1 << (howto->bitsize - 1)) - 1;
|
bfd_signed_vma reloc_signed_max = (1 << (howto->bitsize - 1)) - 1;
|
||||||
bfd_signed_vma reloc_signed_min = ~ reloc_signed_max;
|
bfd_signed_vma reloc_signed_min = ~ reloc_signed_max;
|
||||||
bfd_vma check;
|
|
||||||
bfd_signed_vma signed_check;
|
bfd_signed_vma signed_check;
|
||||||
|
|
||||||
#ifdef USE_REL
|
#ifdef USE_REL
|
||||||
/* Need to refetch addend. */
|
/* Need to refetch addend. */
|
||||||
addend = bfd_get_16 (input_bfd, hit_data) & howto->src_mask;
|
addend = bfd_get_16 (input_bfd, hit_data) & howto->src_mask;
|
||||||
/* ??? Need to determine shift amount from operand size. */
|
if (addend & ((howto->src_mask + 1) >> 1))
|
||||||
addend >>= howto->rightshift;
|
{
|
||||||
|
signed_addend = -1;
|
||||||
|
signed_addend &= ~ howto->src_mask;
|
||||||
|
signed_addend |= addend;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
signed_addend = addend;
|
||||||
|
/* The value in the insn has been right shifted. We need to
|
||||||
|
undo this, so that we can perform the address calculation
|
||||||
|
in terms of bytes. */
|
||||||
|
signed_addend <<= howto->rightshift;
|
||||||
#endif
|
#endif
|
||||||
relocation = value + addend;
|
relocation = value + signed_addend;
|
||||||
|
|
||||||
relocation -= (input_section->output_section->vma
|
relocation -= (input_section->output_section->vma
|
||||||
+ input_section->output_offset
|
+ input_section->output_offset
|
||||||
+ rel->r_offset);
|
+ rel->r_offset);
|
||||||
|
|
||||||
check = relocation >> howto->rightshift;
|
relocation >>= howto->rightshift;
|
||||||
|
signed_check = relocation;
|
||||||
/* If this is a signed value, the rightshift just
|
relocation &= howto->dst_mask;
|
||||||
dropped leading 1 bits (assuming twos complement). */
|
|
||||||
if ((bfd_signed_vma) relocation >= 0)
|
|
||||||
signed_check = check;
|
|
||||||
else
|
|
||||||
signed_check = check | ~((bfd_vma) -1 >> howto->rightshift);
|
|
||||||
|
|
||||||
relocation |= (bfd_get_16 (input_bfd, hit_data) & (~ howto->dst_mask));
|
relocation |= (bfd_get_16 (input_bfd, hit_data) & (~ howto->dst_mask));
|
||||||
|
|
||||||
bfd_put_16 (input_bfd, relocation, hit_data);
|
bfd_put_16 (input_bfd, relocation, hit_data);
|
||||||
|
Reference in New Issue
Block a user