aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Clifton <nickc@redhat.com>2019-11-07 11:36:06 +0000
committerNick Clifton <nickc@redhat.com>2019-11-07 11:36:06 +0000
commitef07b8082ea5f9c48d0c6bcf0e4c1855ddf2c49b (patch)
tree692bfa0c999c20fda4a1d23157f6cac7f61dde58 /binutils
parent[gdb/contrib] Add words.sh script (diff)
downloadbinutils-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.
Diffstat (limited to 'binutils')
-rw-r--r--binutils/ChangeLog6
-rw-r--r--binutils/objcopy.c29
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;
}