Do not generate GNU build notes for linkonce sections.
Resolves: #1576362
This commit is contained in:
parent
1f337663ab
commit
e2612ee0fe
127
binutils-linkonce-notes.patch
Normal file
127
binutils-linkonce-notes.patch
Normal file
@ -0,0 +1,127 @@
|
|||||||
|
--- binutils.orig/gas/write.c 2018-05-14 12:22:27.893671804 +0100
|
||||||
|
+++ binutils-2.30/gas/write.c 2018-05-14 15:39:03.900509629 +0100
|
||||||
|
@@ -1901,6 +1901,7 @@ maybe_generate_build_notes (void)
|
||||||
|
segT sec;
|
||||||
|
char * note;
|
||||||
|
offsetT note_size;
|
||||||
|
+ offsetT total_size;
|
||||||
|
offsetT desc_size;
|
||||||
|
offsetT desc2_offset;
|
||||||
|
int desc_reloc;
|
||||||
|
@@ -1918,7 +1919,8 @@ maybe_generate_build_notes (void)
|
||||||
|
SEC_READONLY | SEC_HAS_CONTENTS | SEC_DATA);
|
||||||
|
bfd_set_section_alignment (stdoutput, sec, 2);
|
||||||
|
|
||||||
|
- /* Create a version note. */
|
||||||
|
+ /* Work out the size of the notes that we will create,
|
||||||
|
+ and the relocation we should use. */
|
||||||
|
if (bfd_arch_bits_per_address (stdoutput) <= 32)
|
||||||
|
{
|
||||||
|
note_size = 28;
|
||||||
|
@@ -1952,65 +1954,59 @@ maybe_generate_build_notes (void)
|
||||||
|
desc_reloc = BFD_RELOC_64;
|
||||||
|
}
|
||||||
|
|
||||||
|
- frag_now_fix ();
|
||||||
|
- note = frag_more (note_size);
|
||||||
|
- memset (note, 0, note_size);
|
||||||
|
+ /* We have to create a note for *each* code section.
|
||||||
|
+ Linker garbage collection might discard some. */
|
||||||
|
+ total_size = 0;
|
||||||
|
+ note = NULL;
|
||||||
|
|
||||||
|
- if (target_big_endian)
|
||||||
|
- {
|
||||||
|
- note[3] = 8; /* strlen (name) + 1. */
|
||||||
|
- note[7] = desc_size; /* Two 8-byte offsets. */
|
||||||
|
- note[10] = NT_GNU_BUILD_ATTRIBUTE_OPEN >> 8;
|
||||||
|
- note[11] = NT_GNU_BUILD_ATTRIBUTE_OPEN & 0xff;
|
||||||
|
- }
|
||||||
|
- else
|
||||||
|
- {
|
||||||
|
- note[0] = 8; /* strlen (name) + 1. */
|
||||||
|
- note[4] = desc_size; /* Two 8-byte offsets. */
|
||||||
|
- note[8] = NT_GNU_BUILD_ATTRIBUTE_OPEN & 0xff;
|
||||||
|
- note[9] = NT_GNU_BUILD_ATTRIBUTE_OPEN >> 8;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- /* The a1 version number indicates that this note was
|
||||||
|
- generated by the assembler and not the gcc annobin plugin. */
|
||||||
|
- memcpy (note + 12, "GA$3a1", 8);
|
||||||
|
-
|
||||||
|
- /* Find the first code section symbol. */
|
||||||
|
for (sym = symbol_rootP; sym != NULL; sym = sym->sy_next)
|
||||||
|
if (sym->bsym != NULL
|
||||||
|
&& sym->bsym->flags & BSF_SECTION_SYM
|
||||||
|
&& sym->bsym->section != NULL
|
||||||
|
- && sym->bsym->section->flags & SEC_CODE)
|
||||||
|
+ /* Skip linkonce sections - we cannot these section symbols as they may disappear. */
|
||||||
|
+ && (sym->bsym->section->flags & (SEC_CODE | SEC_LINK_ONCE)) == SEC_CODE
|
||||||
|
+ /* Not all linkonce sections are flagged... */
|
||||||
|
+ && strncmp (S_GET_NAME (sym), ".gnu.linkonce", sizeof ".gnu.linkonce" - 1) != 0)
|
||||||
|
{
|
||||||
|
- /* Found one - now create a relocation against this symbol. */
|
||||||
|
- create_note_reloc (sec, sym, 20, desc_reloc, 0, note);
|
||||||
|
- break;
|
||||||
|
- }
|
||||||
|
+ /* Create a version note. */
|
||||||
|
+ frag_now_fix ();
|
||||||
|
+ note = frag_more (note_size);
|
||||||
|
+ memset (note, 0, note_size);
|
||||||
|
|
||||||
|
- /* Find the last code section symbol. */
|
||||||
|
- if (sym)
|
||||||
|
- {
|
||||||
|
- for (sym = symbol_lastP; sym != NULL; sym = sym->sy_previous)
|
||||||
|
- if (sym->bsym != NULL
|
||||||
|
- && sym->bsym->flags & BSF_SECTION_SYM
|
||||||
|
- && sym->bsym->section != NULL
|
||||||
|
- && sym->bsym->section->flags & SEC_CODE)
|
||||||
|
+ if (target_big_endian)
|
||||||
|
{
|
||||||
|
- /* Create a relocation against the end of this symbol. */
|
||||||
|
- create_note_reloc (sec, sym, desc2_offset, desc_reloc,
|
||||||
|
- bfd_get_section_size (sym->bsym->section),
|
||||||
|
- note);
|
||||||
|
- break;
|
||||||
|
+ note[3] = 8; /* strlen (name) + 1. */
|
||||||
|
+ note[7] = desc_size; /* Two 8-byte offsets. */
|
||||||
|
+ note[10] = NT_GNU_BUILD_ATTRIBUTE_OPEN >> 8;
|
||||||
|
+ note[11] = NT_GNU_BUILD_ATTRIBUTE_OPEN & 0xff;
|
||||||
|
}
|
||||||
|
- }
|
||||||
|
- /* else - if we were unable to find any code section symbols then
|
||||||
|
- probably there is no code in the output. So leaving the start
|
||||||
|
- and end values as zero in the note is OK. */
|
||||||
|
+ else
|
||||||
|
+ {
|
||||||
|
+ note[0] = 8; /* strlen (name) + 1. */
|
||||||
|
+ note[4] = desc_size; /* Two 8-byte offsets. */
|
||||||
|
+ note[8] = NT_GNU_BUILD_ATTRIBUTE_OPEN & 0xff;
|
||||||
|
+ note[9] = NT_GNU_BUILD_ATTRIBUTE_OPEN >> 8;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /* The a1 version number indicates that this note was
|
||||||
|
+ generated by the assembler and not the gcc annobin plugin. */
|
||||||
|
+ memcpy (note + 12, "GA$3a1", 8);
|
||||||
|
|
||||||
|
- /* FIXME: Maybe add a note recording the assembler command line and version ? */
|
||||||
|
+ /* Create a relocation to install the start address of the note... */
|
||||||
|
+ create_note_reloc (sec, sym, 20, desc_reloc, 0, note);
|
||||||
|
+
|
||||||
|
+ /* ...and another one to install the end address. */
|
||||||
|
+ create_note_reloc (sec, sym, desc2_offset, desc_reloc,
|
||||||
|
+ bfd_get_section_size (sym->bsym->section),
|
||||||
|
+ note);
|
||||||
|
+
|
||||||
|
+ total_size += note_size;
|
||||||
|
+ /* FIXME: Maybe add a note recording the assembler command line and version ? */
|
||||||
|
+ }
|
||||||
|
|
||||||
|
/* Install the note(s) into the section. */
|
||||||
|
- bfd_set_section_contents (stdoutput, sec, (bfd_byte *) note, 0, note_size);
|
||||||
|
+ if (total_size)
|
||||||
|
+ bfd_set_section_contents (stdoutput, sec, (bfd_byte *) note, 0, total_size);
|
||||||
|
subsegs_finish_section (sec);
|
||||||
|
relax_segment (seg_info (sec)->frchainP->frch_root, sec, 0);
|
||||||
|
size_seg (stdoutput, sec, NULL);
|
@ -270,6 +270,11 @@ Patch32: binutils-CVE-2018-10535.patch
|
|||||||
# Lifetime: Fixed in 2.31
|
# Lifetime: Fixed in 2.31
|
||||||
Patch33: binutils-x86-local-relocs.patch
|
Patch33: binutils-x86-local-relocs.patch
|
||||||
|
|
||||||
|
# Purpose: Stop the assembler from generating GNU build notes against
|
||||||
|
# linkonce sections.
|
||||||
|
# Lifetime: Fixed in 2.31
|
||||||
|
Patch34: binutils-linkonce-notes.patch
|
||||||
|
|
||||||
#----------------------------------------------------------------------------
|
#----------------------------------------------------------------------------
|
||||||
|
|
||||||
Provides: bundled(libiberty)
|
Provides: bundled(libiberty)
|
||||||
@ -428,6 +433,7 @@ using libelf instead of BFD.
|
|||||||
%patch31 -p1
|
%patch31 -p1
|
||||||
%patch32 -p1
|
%patch32 -p1
|
||||||
%patch33 -p1
|
%patch33 -p1
|
||||||
|
%patch34 -p1
|
||||||
|
|
||||||
# We cannot run autotools as there is an exact requirement of autoconf-2.59.
|
# We cannot run autotools as there is an exact requirement of autoconf-2.59.
|
||||||
|
|
||||||
@ -843,6 +849,7 @@ exit 0
|
|||||||
%changelog
|
%changelog
|
||||||
* Mon May 14 2018 Nick Clifton <nickc@redhat.com> 2.30-20
|
* Mon May 14 2018 Nick Clifton <nickc@redhat.com> 2.30-20
|
||||||
- Have the x86 linker resolve relocations against the _end, _edata and __bss_start symbols locally. (#1576735)
|
- Have the x86 linker resolve relocations against the _end, _edata and __bss_start symbols locally. (#1576735)
|
||||||
|
- Do not generate GNU build notes for linkonce sections. (#1576362)
|
||||||
|
|
||||||
* Thu May 10 2018 Nick Clifton <nickc@redhat.com> 2.30-19
|
* Thu May 10 2018 Nick Clifton <nickc@redhat.com> 2.30-19
|
||||||
- Fix a seg-fault running objcopy on a corrupt PE format file. (#1574702)
|
- Fix a seg-fault running objcopy on a corrupt PE format file. (#1574702)
|
||||||
|
Loading…
Reference in New Issue
Block a user