From ef07b8082ea5f9c48d0c6bcf0e4c1855ddf2c49b Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Thu, 7 Nov 2019 11:36:06 +0000 Subject: [PATCH] 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. --- binutils/ChangeLog | 6 ++++++ binutils/objcopy.c | 29 ++++++++++++++--------------- 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/binutils/ChangeLog b/binutils/ChangeLog index 61a2e0020cc..fb1a99d5ae4 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,9 @@ +2019-11-07 Nick Clifton + + * 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 * readelf.c (IN_RANGE): Rename parameter OFF to NELEM. Add diff --git a/binutils/objcopy.c b/binutils/objcopy.c index 56439700c22..ea6eb646b4f 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; } -- 2.30.2