[binutils-gdb] Fix bug merging notes with objcopy when no merging results in zeroes being written back into the not

Nick Clifton nickc@sourceware.org
Thu Nov 7 11:36:00 GMT 2019


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=ef07b8082ea5f9c48d0c6bcf0e4c1855ddf2c49b

commit ef07b8082ea5f9c48d0c6bcf0e4c1855ddf2c49b
Author: Nick Clifton <nickc@redhat.com>
Date:   Thu Nov 7 11:36:06 2019 +0000

    Fix bug merging notes with objcopy when no merging results in zeroes being written back into the note section.
    
    	* objcopy.c (copy_object): Skip note sections that do not have
    	an output section.  Always copy note sections, even if no
    	changes are made.

Diff:
---
 binutils/ChangeLog |  6 ++++++
 binutils/objcopy.c | 29 ++++++++++++++---------------
 2 files changed, 20 insertions(+), 15 deletions(-)

diff --git a/binutils/ChangeLog b/binutils/ChangeLog
index 61a2e00..fb1a99d 100644
--- a/binutils/ChangeLog
+++ b/binutils/ChangeLog
@@ -1,3 +1,9 @@
+2019-11-07  Nick Clifton  <nickc@redhat.com>
+
+	* objcopy.c (copy_object): Skip note sections that do not have
+	an output section.  Always copy note sections, even if no
+	changes are made.
+
 2019-11-06  Christian Eggers  <ceggers@gmx.de>
 
 	* readelf.c (IN_RANGE): Rename parameter OFF to NELEM. Add
diff --git a/binutils/objcopy.c b/binutils/objcopy.c
index 5643970..ea6eb64 100644
--- a/binutils/objcopy.c
+++ b/binutils/objcopy.c
@@ -2878,6 +2878,11 @@ copy_object (bfd *ibfd, bfd *obfd, const bfd_arch_info_type *input_arch)
 	  if (! is_mergeable_note_section (ibfd, osec))
 	    continue;
 
+	  /* If the section is going to be completly deleted then
+	     do not bother to merge it.  */
+	  if (osec->output_section == NULL)
+	    continue;
+
 	  bfd_size_type size = bfd_section_size (osec);
 
 	  if (size == 0)
@@ -2893,25 +2898,19 @@ copy_object (bfd *ibfd, bfd *obfd, const bfd_arch_info_type *input_arch)
 	    {
 	      bfd_nonfatal_message (NULL, ibfd, osec,
 				    _("warning: could not load note section"));
-	      free (merged->contents);
 	      free (merged);
 	      continue;
 	    }
 
 	  merged->size = merge_gnu_build_notes (ibfd, osec, size,
 						merged->contents);
-	  if (merged->size == size)
-	    {
-	      /* Merging achieves nothing.  */
-	      merge_debug ("Merge of section %s achieved nothing - skipping\n",
-			   bfd_section_name (osec));
-	      free (merged->contents);
-	      free (merged);
-	      continue;
-	    }
 
-	  if (osec->output_section == NULL
-	      || !bfd_set_section_size (osec->output_section, merged->size))
+	  /* FIXME: Once we have read the contents in, we must write
+	     them out again.  So even if the mergeing has achieved
+	     nothing we still add this entry to the merge list.  */
+
+	  if (size != merged->size
+	      && !bfd_set_section_size (osec->output_section, merged->size))
 	    {
 	      bfd_nonfatal_message (NULL, obfd, osec,
 				    _("warning: failed to set merged notes size"));
@@ -3277,16 +3276,16 @@ copy_object (bfd *ibfd, bfd *obfd, const bfd_arch_info_type *input_arch)
 		{
 		  bfd_nonfatal_message
 		    (NULL, obfd, osec,
-		     _("error: failed to copy merged notes into output"));
+		     _("error: failed to locate merged notes"));
 		  continue;
 		}
 	    }
 
-	  if (! is_mergeable_note_section (obfd, osec))
+	  if (merged->contents == NULL)
 	    {
 	      bfd_nonfatal_message
 		(NULL, obfd, osec,
-		 _("error: failed to copy merged notes into output"));
+		 _("error: failed to merge notes"));
 	      continue;
 	    }



More information about the Binutils-cvs mailing list