diff options
Diffstat (limited to 'binutils')
-rw-r--r-- | binutils/ChangeLog | 6 | ||||
-rw-r--r-- | 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; } |