Don't merge notes when the relocs associated with them cannot be reliably deleted.
authorNick Clifton <nickc@redhat.com>
Tue, 2 May 2017 15:54:53 +0000 (16:54 +0100)
committerNick Clifton <nickc@redhat.com>
Tue, 2 May 2017 15:55:31 +0000 (16:55 +0100)
* objcopy.c (merge_gnu_build_notes): Disable merge if there are
more internal relocs than external relocs.

binutils/ChangeLog
binutils/objcopy.c

index aef436d3020b48d6fddddf2ec539017bbab59160..d13dbb637d45918330dfff4ea0aa0d44779e1633 100644 (file)
@@ -1,3 +1,8 @@
+2017-05-02  Nick Clifton  <nickc@redhat.com>
+
+       * objcopy.c (merge_gnu_build_notes): Disable merge if there are
+       more internal relocs than external relocs.
+
 2017-05-02  Maciej W. Rozycki  <macro@imgtec.com>
 
        * testsuite/binutils-all/mips/mips16-undecoded.d: Adjust the
index 42c7775234dd70a84a959686769a6e39f8f5c30c..36952ecd6f587cb5acf17774215ec848744afb9a 100644 (file)
@@ -2137,6 +2137,13 @@ merge_gnu_build_notes (bfd * abfd, asection * sec, bfd_size_type size, bfd_byte
            relcount = 0;
        }
 
+      /* A few targets (eg MIPS, SPARC) create multiple internal relocs to
+        represent a single external reloc.  Unfortunately the current BFD
+        API does not handle deleting relocs in such situations very well
+        and so it is unsafe to proceed.  */
+      if (relcount > sec->reloc_count)
+       goto done;
+
       /* Eliminate the duplicates.  */
       new = new_contents = xmalloc (size);
       for (pnote = pnotes, old = contents;