aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoern Rennecke <joern.rennecke@embecosm.com>1999-06-03 19:12:54 +0000
committerJoern Rennecke <joern.rennecke@embecosm.com>1999-06-03 19:12:54 +0000
commit06e1ba78a095ad4a09894bbd1efd83c79ab3e2fe (patch)
treea9cd5437fba0cba8b3d165b4ce4bebeac3d15c28
parent084aa3aa9f448323ca9af578ae1d405f82717410 (diff)
downloadfsf-binutils-gdb-06e1ba78a095ad4a09894bbd1efd83c79ab3e2fe.zip
fsf-binutils-gdb-06e1ba78a095ad4a09894bbd1efd83c79ab3e2fe.tar.gz
fsf-binutils-gdb-06e1ba78a095ad4a09894bbd1efd83c79ab3e2fe.tar.bz2
* elf32-sh.c (sh_elf_relax_delete_bytes): Fix setting of
start / stop for recalculating of r_addend of R_SH_SWITCH*.
-rw-r--r--bfd/ChangeLog5
-rw-r--r--bfd/elf32-sh.c12
2 files changed, 11 insertions, 6 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 0cfee3d..a5d2065 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,8 @@
+Fri Jun 4 03:10:49 1999 J"orn Rennecke <amylaar@cygnus.co.uk>
+
+ * elf32-sh.c (sh_elf_relax_delete_bytes): Fix setting of
+ start / stop for recalculating of r_addend of R_SH_SWITCH*.
+
Fri Jun 4 02:53:13 1999 J"orn Rennecke <amylaar@cygnus.co.uk>
* elf32-sh.c (sh_elf_relax_delete_bytes): Handle R_SH_SWITCH32
diff --git a/bfd/elf32-sh.c b/bfd/elf32-sh.c
index b3670d0..0779e8a 100644
--- a/bfd/elf32-sh.c
+++ b/bfd/elf32-sh.c
@@ -1161,13 +1161,15 @@ sh_elf_relax_delete_bytes (abfd, sec, addr, count)
case R_SH_SWITCH32:
/* These relocs types represent
.word L2-L1
- The r_offset field holds the difference between the reloc
+ The r_addend field holds the difference between the reloc
address and L1. That is the start of the reloc, and
adding in the contents gives us the top. We must adjust
- both the r_offset field and the section contents. */
+ both the r_offset field and the section contents.
+ N.B. in gas / coff bfd, the elf bfd r_addend is called r_offset,
+ and the elf bfd r_offset is called r_vaddr. */
- start = irel->r_offset;
- stop = (bfd_vma) ((bfd_signed_vma) start - (long) irel->r_addend);
+ stop = irel->r_offset;
+ start = (bfd_vma) ((bfd_signed_vma) stop - (long) irel->r_addend);
if (start > addr
&& start < toaddr
@@ -1178,8 +1180,6 @@ sh_elf_relax_delete_bytes (abfd, sec, addr, count)
&& (start <= addr || start >= toaddr))
irel->r_addend -= count;
- start = stop;
-
if (ELF32_R_TYPE (irel->r_info) == (int) R_SH_SWITCH16)
voff = bfd_get_signed_16 (abfd, contents + nraddr);
else if (ELF32_R_TYPE (irel->r_info) == (int) R_SH_SWITCH8)