This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[m32c] Adjust symbol sizes when relaxing


Committed.

	* elf32-m32c.c (m32c_elf_relax_delete_bytes): Adjust symbol sizes
	if needed.

Index: elf32-m32c.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-m32c.c,v
retrieving revision 1.18
diff -p -U3 -r1.18 elf32-m32c.c
--- elf32-m32c.c	30 Jul 2008 04:34:56 -0000	1.18
+++ elf32-m32c.c	14 Aug 2009 03:43:06 -0000
@@ -1951,13 +1951,24 @@ m32c_elf_relax_delete_bytes
 
   for (; isym < isymend; isym++, shndx = (shndx ? shndx + 1 : NULL))
     {
-
+      /* If the symbol is in the range of memory we just moved, we
+	 have to adjust its value.  */
       if ((int) isym->st_shndx == sec_shndx
 	  && isym->st_value > addr
 	  && isym->st_value < toaddr)
 	{
 	  isym->st_value -= count;
 	}
+      /* If the symbol *spans* the bytes we just deleted (i.e. it's
+	 *end* is in the moved bytes but it's *start* isn't), then we
+	 must adjust its size.  */
+      if ((int) isym->st_shndx == sec_shndx
+	    && isym->st_value < addr
+	  && isym->st_value + isym->st_size > addr
+	  && isym->st_value + isym->st_size < toaddr)
+	{
+	  isym->st_size -= count;
+	}
     }
 
   /* Now adjust the global symbols defined in this section.  */
@@ -1972,13 +1983,21 @@ m32c_elf_relax_delete_bytes
       struct elf_link_hash_entry * sym_hash = * sym_hashes;
 
       if (sym_hash &&
-	  (   sym_hash->root.type == bfd_link_hash_defined
+	  (sym_hash->root.type == bfd_link_hash_defined
 	   || sym_hash->root.type == bfd_link_hash_defweak)
-	  && sym_hash->root.u.def.section == sec
-	  && sym_hash->root.u.def.value > addr
-	  && sym_hash->root.u.def.value < toaddr)
+	  && sym_hash->root.u.def.section == sec)
 	{
-	  sym_hash->root.u.def.value -= count;
+	  if (sym_hash->root.u.def.value > addr
+	      && sym_hash->root.u.def.value < toaddr)
+	    {
+	      sym_hash->root.u.def.value -= count;
+	    }
+	  if (sym_hash->root.u.def.value < addr
+	      && sym_hash->root.u.def.value + sym_hash->size > addr
+	      && sym_hash->root.u.def.value + sym_hash->size < toaddr)
+	    {
+	      sym_hash->size -= count;
+	    }
 	}
     }
 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]