Commit: Improvements to objcopy's note merging

Nick Clifton nickc@redhat.com
Fri Aug 3 16:08:00 GMT 2018


Hi Guys,

  I am checking in the patch below to make a couple of improvements to
  objcopy's note merging capability.  Specifically empty notes are now
  automatically deleted, and function notes which are duplicates of
  each other are also reduced to just one copy.

Cheers
  Nick

binutils/ChangeLog
2018-08-03  Nick Clifton  <nickc@redhat.com>

	* objcopy.c (merge_gnu_build_notes): Delete empty notes.  Merge
	identical function notes.

diff --git a/binutils/objcopy.c b/binutils/objcopy.c
index 001cddf14c..6bd933993b 100644
--- a/binutils/objcopy.c
+++ b/binutils/objcopy.c
@@ -2185,16 +2185,48 @@ merge_gnu_build_notes (bfd * abfd, asection * sec, bfd_size_type size, bfd_byte
         its description field is empty then the nearest preceeding OPEN note
 	with a non-empty description field must also be preserved *OR* the
 	description field of the note must be changed to contain the starting
-	address to which it refers.  */
+	address to which it refers.
+     6. Notes with the same start and end address can be deleted.  */
   for (pnote = pnotes + 1; pnote < pnotes_end; pnote ++)
     {
       int                      note_type;
       objcopy_internal_note *  back;
       objcopy_internal_note *  prev_open_with_range = NULL;
 
+      /* Rule 6 - delete 0-range notes.  */
+      if (pnote->start == pnote->end)
+	{
+	  duplicate_found = TRUE;
+	  pnote->note.type = 0;
+	  continue;
+	}
+
       /* Rule 2 - preserve function notes.  */
       if (! is_open_note (pnote))
-	continue;
+	{
+	  int iter;
+
+	  /* Check to see if there is an identical previous function note.
+	     This can happen with overlays for example.  */
+	  for (iter = 0, back = pnote -1; back >= pnotes; back --)
+	    {
+	      if (back->start == pnote->start
+		  && back->end == pnote->end
+		  && back->note.namesz == pnote->note.namesz
+		  && memcmp (back->note.namedata, pnote->note.namedata, pnote->note.namesz) == 0)
+		{
+ fprintf (stderr, "DUP FUNXC\n");
+		  duplicate_found = TRUE;
+		  pnote->note.type = 0;
+		  break;
+		}
+
+	      /* Don't scan too far back however.  */
+	      if (iter ++ > 16)
+		break;
+	    }
+	  continue;
+	}
 
       note_type = pnote->note.namedata[attribute_type_byte];
 



More information about the Binutils mailing list