From e2612ee0feb0656a6f657eebbd54254b8e8082b6 Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Mon, 14 May 2018 16:02:15 +0100 Subject: [PATCH] Do not generate GNU build notes for linkonce sections. Resolves: #1576362 --- binutils-linkonce-notes.patch | 127 ++++++++++++++++++++++++++++++++++ binutils.spec | 7 ++ 2 files changed, 134 insertions(+) create mode 100644 binutils-linkonce-notes.patch diff --git a/binutils-linkonce-notes.patch b/binutils-linkonce-notes.patch new file mode 100644 index 0000000..3a01ec1 --- /dev/null +++ b/binutils-linkonce-notes.patch @@ -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); diff --git a/binutils.spec b/binutils.spec index 74fc42a..77c848f 100644 --- a/binutils.spec +++ b/binutils.spec @@ -270,6 +270,11 @@ Patch32: binutils-CVE-2018-10535.patch # Lifetime: Fixed in 2.31 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) @@ -428,6 +433,7 @@ using libelf instead of BFD. %patch31 -p1 %patch32 -p1 %patch33 -p1 +%patch34 -p1 # We cannot run autotools as there is an exact requirement of autoconf-2.59. @@ -843,6 +849,7 @@ exit 0 %changelog * Mon May 14 2018 Nick Clifton 2.30-20 - 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 2.30-19 - Fix a seg-fault running objcopy on a corrupt PE format file. (#1574702)