aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYufeng Zhang <yufeng.zhang@arm.com>2012-11-16 18:54:07 +0000
committerYufeng Zhang <yufeng.zhang@arm.com>2012-11-16 18:54:07 +0000
commitcf899e260a0f473ee86e9bba531132f9d7da97e5 (patch)
treea520bfa43263bd3f03d323ff818ee703f5df9466
parentac8ab36229346db67b5be1e0ae979631e84d0ffe (diff)
downloadbinutils-binutils-2_21-branch.zip
binutils-binutils-2_21-branch.tar.gz
binutils-binutils-2_21-branch.tar.bz2
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.
-rw-r--r--bfd/ChangeLog9
-rw-r--r--bfd/elf32-arm.c25
2 files changed, 23 insertions, 11 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 6bcef2f..3018470 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,12 @@
+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.
+
2011-06-27 Tristan Gingold <gingold@adacore.com>
* Makefile.am (RELEASE): Unset.
diff --git a/bfd/elf32-arm.c b/bfd/elf32-arm.c
index e03ce0e..c94f514 100644
--- a/bfd/elf32-arm.c
+++ b/bfd/elf32-arm.c
@@ -1,6 +1,6 @@
/* 32-bit ELF support for ARM
Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
- 2008, 2009, 2010 Free Software Foundation, Inc.
+ 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
This file is part of BFD, the Binary File Descriptor library.
@@ -61,6 +61,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,
@@ -7390,9 +7393,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);
@@ -7422,12 +7425,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);
@@ -7462,9 +7465,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);