diff options
author | 2019-11-07 11:36:06 +0000 | |
---|---|---|
committer | 2019-11-07 11:36:06 +0000 | |
commit | ef07b8082ea5f9c48d0c6bcf0e4c1855ddf2c49b (patch) | |
tree | 692bfa0c999c20fda4a1d23157f6cac7f61dde58 | |
parent | [gdb/contrib] Add words.sh script (diff) | |
download | binutils-gdb-ef07b8082ea5f9c48d0c6bcf0e4c1855ddf2c49b.tar.gz binutils-gdb-ef07b8082ea5f9c48d0c6bcf0e4c1855ddf2c49b.tar.bz2 binutils-gdb-ef07b8082ea5f9c48d0c6bcf0e4c1855ddf2c49b.zip |
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.
-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 61a2e0020cc..fb1a99d5ae4 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 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; } |