aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Diky <diwil@spec.ru>2005-08-12 11:45:26 +0000
committerDmitry Diky <diwil@spec.ru>2005-08-12 11:45:26 +0000
commitfa9ee72b809ca1d54a80ac90043b315b33bb6a8a (patch)
tree166870ef33f356eea165f0b6c2c0123781f11aaf
parente079bef8e567e380e0ac9a9299b7b85c2a87cfc4 (diff)
downloadgdb-fa9ee72b809ca1d54a80ac90043b315b33bb6a8a.zip
gdb-fa9ee72b809ca1d54a80ac90043b315b33bb6a8a.tar.gz
gdb-fa9ee72b809ca1d54a80ac90043b315b33bb6a8a.tar.bz2
2005-08-12 Dmitry Diky <diwil@spec.ru>
* elf32-msp430.c (msp430_elf_relax_delete_bytes): Adjust relocations referenced by .section + DISPLACEMENT.
-rw-r--r--bfd/ChangeLog5
-rw-r--r--bfd/elf32-msp430.c18
2 files changed, 20 insertions, 3 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index a7a7608..aa15d4c 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,8 @@
+2005-08-12 Dmitry Diky <diwil@spec.ru>
+
+ * elf32-msp430.c (msp430_elf_relax_delete_bytes): Adjust relocations
+ referenced by .section + DISPLACEMENT.
+
2005-08-10 James E. Wilson <wilson@specifix.com>
* dwarf2.c (scan_unit_for_symbols, case DT_AT_location): Verify that
diff --git a/bfd/elf32-msp430.c b/bfd/elf32-msp430.c
index da42782..3aec7aa 100644
--- a/bfd/elf32-msp430.c
+++ b/bfd/elf32-msp430.c
@@ -868,10 +868,22 @@ msp430_elf_relax_delete_bytes (bfd * abfd, asection * sec, bfd_vma addr,
sec->size -= count;
/* Adjust all the relocs. */
+ symtab_hdr = & elf_tdata (abfd)->symtab_hdr;
+ isym = (Elf_Internal_Sym *) symtab_hdr->contents;
for (irel = elf_section_data (sec)->relocs; irel < irelend; irel++)
- /* Get the new reloc address. */
- if ((irel->r_offset > addr && irel->r_offset < toaddr))
- irel->r_offset -= count;
+ {
+ int sidx = ELF32_R_SYM(irel->r_info);
+ Elf_Internal_Sym *lsym = isym + sidx;
+
+ /* Get the new reloc address. */
+ if ((irel->r_offset > addr && irel->r_offset < toaddr))
+ irel->r_offset -= count;
+
+ /* Adjust symbols referenced by .sec+0xXX */
+ if (irel->r_addend > addr && irel->r_addend < toaddr
+ && lsym->st_shndx == sec_shndx)
+ irel->r_addend -= count;
+ }
/* Adjust the local symbols defined in this section. */
symtab_hdr = & elf_tdata (abfd)->symtab_hdr;