From da3bd9a9beb38b5246ebdd57c3889853b8eafc2f Mon Sep 17 00:00:00 2001 From: Yufeng Zhang Date: Fri, 16 Nov 2012 18:44:05 +0000 Subject: bfd/ChangeLog 2012-11-16 Joey Ye * 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. --- bfd/ChangeLog | 9 +++++++++ bfd/elf32-arm.c | 25 ++++++++++++++----------- 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index a568f1b33e..c7eb35b6cd 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,12 @@ +2012-11-16 Joey Ye + + * 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. + 2012-05-11 Ralf Corsépius Backport from mainline: diff --git a/bfd/elf32-arm.c b/bfd/elf32-arm.c index 9355f6651d..deb71f172d 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, 2011 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, @@ -8441,9 +8444,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); @@ -8473,12 +8476,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); @@ -8513,9 +8516,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); -- cgit v1.2.1