2005-08-12 Dmitry Diky <diwil@spec.ru>
authorDmitry Diky <diwil@spec.ru>
Fri, 12 Aug 2005 11:45:26 +0000 (11:45 +0000)
committerDmitry Diky <diwil@spec.ru>
Fri, 12 Aug 2005 11:45:26 +0000 (11:45 +0000)
* elf32-msp430.c (msp430_elf_relax_delete_bytes): Adjust relocations
referenced by .section + DISPLACEMENT.

bfd/ChangeLog
bfd/elf32-msp430.c

index a7a7608d5add1e1eb4914cf4e79afe6cda31c94c..aa15d4cb447d93f3e31f8146a7b066cf91a155f8 100644 (file)
@@ -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
index da4278267c39bca3373020c932c7a0ce8111c50a..3aec7aaebe6f9af146f6f33d7b67aff463167896 100644 (file)
@@ -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;