aboutsummaryrefslogtreecommitdiff
path: root/bfd/elf32-arm.c
diff options
context:
space:
mode:
authorYufeng Zhang <yufeng.zhang@arm.com>2012-11-16 18:33:00 +0000
committerYufeng Zhang <yufeng.zhang@arm.com>2012-11-16 18:33:00 +0000
commit79f080079c7ea480a8b16b6d600536e628e558b4 (patch)
treec5bb7f939bf31fa11c8aa4e98bbab7b5c939d8ef /bfd/elf32-arm.c
parent34b600287684d6297de838a388b1f9729952aae5 (diff)
downloadgdb-79f080079c7ea480a8b16b6d600536e628e558b4.zip
gdb-79f080079c7ea480a8b16b6d600536e628e558b4.tar.gz
gdb-79f080079c7ea480a8b16b6d600536e628e558b4.tar.bz2
bfd/ChangeLog
2012-11-16 Joey Ye <joey.ye@arm.com> * elf32-arm.c (elf32_arm_final_link_relocate, case R_ARM_THM_ALU_PREL_11_0, case R_ARM_THM_PC12): Align address of the place being relocated. (elf32_arm_final_link_relocate, case R_ARM_THM_PC8): Align address of the place being relocated and truncate addend. (Pa): New macro.
Diffstat (limited to 'bfd/elf32-arm.c')
-rw-r--r--bfd/elf32-arm.c23
1 files changed, 13 insertions, 10 deletions
diff --git a/bfd/elf32-arm.c b/bfd/elf32-arm.c
index 081265c..fd7d26a 100644
--- a/bfd/elf32-arm.c
+++ b/bfd/elf32-arm.c
@@ -63,6 +63,9 @@
#define ARM_ELF_ABI_VERSION 0
#define ARM_ELF_OS_ABI_VERSION ELFOSABI_ARM
+/* The Adjusted Place, as defined by AAELF. */
+#define Pa(X) ((X) & 0xfffffffc)
+
static bfd_boolean elf32_arm_write_section (bfd *output_bfd,
struct bfd_link_info *link_info,
asection *sec,
@@ -8619,9 +8622,9 @@ elf32_arm_final_link_relocate (reloc_howto_type * howto,
}
relocation = value + signed_addend;
- relocation -= (input_section->output_section->vma
- + input_section->output_offset
- + rel->r_offset);
+ relocation -= Pa (input_section->output_section->vma
+ + input_section->output_offset
+ + rel->r_offset);
value = abs (relocation);
@@ -8651,12 +8654,12 @@ elf32_arm_final_link_relocate (reloc_howto_type * howto,
insn = bfd_get_16 (input_bfd, hit_data);
if (globals->use_rel)
- addend = (insn & 0x00ff) << 2;
+ addend = ((((insn & 0x00ff) << 2) + 4) & 0x3ff) -4;
relocation = value + addend;
- relocation -= (input_section->output_section->vma
- + input_section->output_offset
- + rel->r_offset);
+ relocation -= Pa (input_section->output_section->vma
+ + input_section->output_offset
+ + rel->r_offset);
value = abs (relocation);
@@ -8691,9 +8694,9 @@ elf32_arm_final_link_relocate (reloc_howto_type * howto,
}
relocation = value + signed_addend;
- relocation -= (input_section->output_section->vma
- + input_section->output_offset
- + rel->r_offset);
+ relocation -= Pa (input_section->output_section->vma
+ + input_section->output_offset
+ + rel->r_offset);
value = abs (relocation);