aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Clifton <nickc@redhat.com>1998-12-08 15:44:06 +0000
committerNick Clifton <nickc@redhat.com>1998-12-08 15:44:06 +0000
commit811c57ffa1fd6dcb78bfc5065dc9eefae99b456f (patch)
tree98839216c0c2738db29b9a8288b33a38b19c7c0e
parent8ecd559a563f80c84562ccc1633059f5437678bf (diff)
downloadfsf-binutils-gdb-811c57ffa1fd6dcb78bfc5065dc9eefae99b456f.zip
fsf-binutils-gdb-811c57ffa1fd6dcb78bfc5065dc9eefae99b456f.tar.gz
fsf-binutils-gdb-811c57ffa1fd6dcb78bfc5065dc9eefae99b456f.tar.bz2
Fix pc relative relocs.
-rw-r--r--bfd/ChangeLog6
-rw-r--r--bfd/elf32-fr30.c10
2 files changed, 13 insertions, 3 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 34651c5..0ec7529 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,9 @@
+1998-12-08 Nick Clifton <nickc@cygnus.com>
+
+ * elf32-fr30.c (fr30_final_link_relocate): Fix PC relative
+ relocations to include offset of 2 included in the insns, and the
+ offset of the relocs within the section.
+
Wed Dec 2 15:03:59 1998 David Taylor <taylor@texas.cygnus.com>
The following changes were made by David Taylor
diff --git a/bfd/elf32-fr30.c b/bfd/elf32-fr30.c
index 0e4171f..17bcc98 100644
--- a/bfd/elf32-fr30.c
+++ b/bfd/elf32-fr30.c
@@ -383,8 +383,10 @@ fr30_final_link_relocate (howto, input_bfd, input_section, contents, rel, reloca
case R_FR30_9_PCREL:
contents += rel->r_offset + 1;
- relocation += rel->r_addend;
srel = (bfd_signed_vma) relocation;
+ srel += rel->r_addend;
+ srel -= rel->r_offset;
+ srel -= 2; /* Branch instructions add 2 to the PC... */
srel -= (input_section->output_section->vma +
input_section->output_offset);
@@ -392,14 +394,16 @@ fr30_final_link_relocate (howto, input_bfd, input_section, contents, rel, reloca
return bfd_reloc_outofrange;
if (srel > ((1 << 8) - 1) || (srel < - (1 << 8)))
return bfd_reloc_overflow;
-
+
bfd_put_8 (input_bfd, srel >> 1, contents);
break;
case R_FR30_12_PCREL:
contents += rel->r_offset;
- relocation += rel->r_addend;
srel = (bfd_signed_vma) relocation;
+ srel += rel->r_addend;
+ srel -= rel->r_offset;
+ srel -= 2; /* Branch instructions add 2 to the PC... */
srel -= (input_section->output_section->vma +
input_section->output_offset);