Commit: Improvements to objcopy's note merging
Nick Clifton
nickc@redhat.com
Fri Aug 3 16:08:00 GMT 2018
Hi Guys,
I am checking in the patch below to make a couple of improvements to
objcopy's note merging capability. Specifically empty notes are now
automatically deleted, and function notes which are duplicates of
each other are also reduced to just one copy.
Cheers
Nick
binutils/ChangeLog
2018-08-03 Nick Clifton <nickc@redhat.com>
* objcopy.c (merge_gnu_build_notes): Delete empty notes. Merge
identical function notes.
diff --git a/binutils/objcopy.c b/binutils/objcopy.c
index 001cddf14c..6bd933993b 100644
--- a/binutils/objcopy.c
+++ b/binutils/objcopy.c
@@ -2185,16 +2185,48 @@ merge_gnu_build_notes (bfd * abfd, asection * sec, bfd_size_type size, bfd_byte
its description field is empty then the nearest preceeding OPEN note
with a non-empty description field must also be preserved *OR* the
description field of the note must be changed to contain the starting
- address to which it refers. */
+ address to which it refers.
+ 6. Notes with the same start and end address can be deleted. */
for (pnote = pnotes + 1; pnote < pnotes_end; pnote ++)
{
int note_type;
objcopy_internal_note * back;
objcopy_internal_note * prev_open_with_range = NULL;
+ /* Rule 6 - delete 0-range notes. */
+ if (pnote->start == pnote->end)
+ {
+ duplicate_found = TRUE;
+ pnote->note.type = 0;
+ continue;
+ }
+
/* Rule 2 - preserve function notes. */
if (! is_open_note (pnote))
- continue;
+ {
+ int iter;
+
+ /* Check to see if there is an identical previous function note.
+ This can happen with overlays for example. */
+ for (iter = 0, back = pnote -1; back >= pnotes; back --)
+ {
+ if (back->start == pnote->start
+ && back->end == pnote->end
+ && back->note.namesz == pnote->note.namesz
+ && memcmp (back->note.namedata, pnote->note.namedata, pnote->note.namesz) == 0)
+ {
+ fprintf (stderr, "DUP FUNXC\n");
+ duplicate_found = TRUE;
+ pnote->note.type = 0;
+ break;
+ }
+
+ /* Don't scan too far back however. */
+ if (iter ++ > 16)
+ break;
+ }
+ continue;
+ }
note_type = pnote->note.namedata[attribute_type_byte];
More information about the Binutils
mailing list