PR 10072
authorNick Clifton <nickc@redhat.com>
Wed, 1 Jul 2009 14:48:26 +0000 (14:48 +0000)
committerNick Clifton <nickc@redhat.com>
Wed, 1 Jul 2009 14:48:26 +0000 (14:48 +0000)
        * elf32-arm.c (elf32_arm_final_link_relocate): Add code to handle
        to R_ARM_THM_PC8 relocation.

bfd/ChangeLog
bfd/elf32-arm.c

index 6b00d40bd6f0295a34e5153dcb0a6d22616656b3..aca27d57612c52f48d6006315f0d41662063916c 100644 (file)
@@ -1,3 +1,9 @@
+2009-07-01  Nick Clifton  <nickc@redhat.com>
+
+       PR 10072
+       * elf32-arm.c (elf32_arm_final_link_relocate): Add code to handle
+       to R_ARM_THM_PC8 relocation.
+
 2009-06-29  Nick Clifton  <nickc@redhat.com>
 
        * elf-m10300.c (mn10300_elf_relax_section): Allow for the
index cd40eefbf5c52e3d108ca01b5e0666fab066fb65..2d53304e4e3593e5f4798865e421145557a8f34c 100644 (file)
@@ -7178,6 +7178,40 @@ elf32_arm_final_link_relocate (reloc_howto_type *           howto,
         return bfd_reloc_ok;
       }
 
+    case R_ARM_THM_PC8:
+      /* PR 10073:  This reloc is not generated by the GNU toolchain,
+        but it is supported for compatibility with third party libraries
+        generated by other compilers, specifically the ARM/IAR.  */
+      {
+       bfd_vma insn;
+       bfd_signed_vma relocation;
+
+       insn = bfd_get_16 (input_bfd, hit_data);
+
+        if (globals->use_rel)
+         addend = (insn & 0x00ff) << 2;
+
+       relocation = value + addend;
+       relocation -= (input_section->output_section->vma
+                      + input_section->output_offset
+                      + rel->r_offset);
+
+        value = abs (relocation);
+
+       /* We do not check for overflow of this reloc.  Although strictly
+          speaking this is incorrect, it appears to be necessary in order
+          to work with IAR generated relocs.  Since GCC and GAS do not
+          generate R_ARM_THM_PC8 relocs, the lack of a check should not be
+          a problem for them.  */
+       value &= 0x3fc;
+
+       insn = (insn & 0xff00) | (value >> 2);
+
+       bfd_put_16 (input_bfd, insn, hit_data);
+
+        return bfd_reloc_ok;
+      }
+
     case R_ARM_THM_PC12:
       /* Corresponds to: ldr.w reg, [pc, #offset].  */
       {