Fix handling of R_ARM_THM_PC11

This commit is contained in:
Nick Clifton
2002-09-12 13:18:57 +00:00
parent 065c959b71
commit 6cf9e9fe1d
2 changed files with 22 additions and 14 deletions

View File

@ -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

View File

@ -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);