Import FSF binutils patch to fix running readelf on debug info binaries.

Update GNU BUILD NOTES patch.
Resolves: #1434050
This commit is contained in:
Nick Clifton 2017-03-20 17:27:38 +00:00
parent 40ca8bea3c
commit 3b2ebb27b1
3 changed files with 381 additions and 226 deletions

View File

@ -0,0 +1,33 @@
diff -rup binutils.orig/binutils/readelf.c binutils-2.28/binutils/readelf.c
--- binutils.orig/binutils/readelf.c 2017-03-20 17:06:41.260789454 +0000
+++ binutils-2.28/binutils/readelf.c 2017-03-20 17:08:09.181289807 +0000
@@ -4965,12 +4965,6 @@ process_program_headers (FILE * file)
section in the DYNAMIC segment. */
dynamic_addr = segment->p_offset;
dynamic_size = segment->p_filesz;
- /* PR binutils/17512: Avoid corrupt dynamic section info in the segment. */
- if (dynamic_addr + dynamic_size >= current_file_size)
- {
- error (_("the dynamic segment offset + size exceeds the size of the file\n"));
- dynamic_addr = dynamic_size = 0;
- }
/* Try to locate the .dynamic section. If there is
a section header table, we can easily locate it. */
@@ -5005,6 +4999,16 @@ process_program_headers (FILE * file)
warn (_("the .dynamic section is not the first section"
" in the dynamic segment.\n"));
}
+
+ /* PR binutils/17512: Avoid corrupt dynamic section info in the
+ segment. Check this after matching against the section headers
+ so we don't warn on debuginfo file (which have NOBITS .dynamic
+ sections). */
+ if (dynamic_addr + dynamic_size >= current_file_size)
+ {
+ error (_("the dynamic segment offset + size exceeds the size of the file\n"));
+ dynamic_addr = dynamic_size = 0;
+ }
break;
case PT_INTERP:

View File

@ -1,6 +1,6 @@
diff -rup binutils.orig/binutils/doc/binutils.texi binutils-2.28/binutils/doc/binutils.texi diff -rup binutils.orig/binutils/doc/binutils.texi binutils-2.28/binutils/doc/binutils.texi
--- binutils.orig/binutils/doc/binutils.texi 2017-03-03 10:36:54.749752520 +0000 --- binutils.orig/binutils/doc/binutils.texi 2017-03-20 17:03:56.166605442 +0000
+++ binutils-2.28/binutils/doc/binutils.texi 2017-03-03 10:55:09.843757253 +0000 +++ binutils-2.28/binutils/doc/binutils.texi 2017-03-20 17:04:07.688408917 +0000
@@ -1140,6 +1140,7 @@ objcopy [@option{-F} @var{bfdname}|@opti @@ -1140,6 +1140,7 @@ objcopy [@option{-F} @var{bfdname}|@opti
[@option{--compress-debug-sections}] [@option{--compress-debug-sections}]
[@option{--decompress-debug-sections}] [@option{--decompress-debug-sections}]
@ -21,8 +21,8 @@ diff -rup binutils.orig/binutils/doc/binutils.texi binutils-2.28/binutils/doc/bi
@itemx --version @itemx --version
Show the version number of @command{objcopy}. Show the version number of @command{objcopy}.
diff -rup binutils.orig/binutils/NEWS binutils-2.28/binutils/NEWS diff -rup binutils.orig/binutils/NEWS binutils-2.28/binutils/NEWS
--- binutils.orig/binutils/NEWS 2017-03-03 10:36:54.777751983 +0000 --- binutils.orig/binutils/NEWS 2017-03-20 17:03:56.167605425 +0000
+++ binutils-2.28/binutils/NEWS 2017-03-03 10:49:43.114021660 +0000 +++ binutils-2.28/binutils/NEWS 2017-03-20 17:04:07.688408917 +0000
@@ -1,5 +1,8 @@ @@ -1,5 +1,8 @@
-*- text -*- -*- text -*-
@ -33,8 +33,8 @@ diff -rup binutils.orig/binutils/NEWS binutils-2.28/binutils/NEWS
* Add support for locating separate debug info files using the build-id * Add support for locating separate debug info files using the build-id
diff -rup binutils.orig/binutils/objcopy.c binutils-2.28/binutils/objcopy.c diff -rup binutils.orig/binutils/objcopy.c binutils-2.28/binutils/objcopy.c
--- binutils.orig/binutils/objcopy.c 2017-03-03 10:36:54.780751925 +0000 --- binutils.orig/binutils/objcopy.c 2017-03-20 17:03:56.167605425 +0000
+++ binutils-2.28/binutils/objcopy.c 2017-03-03 10:54:00.510086591 +0000 +++ binutils-2.28/binutils/objcopy.c 2017-03-20 17:04:07.718408405 +0000
@@ -30,6 +30,7 @@ @@ -30,6 +30,7 @@
#include "elf-bfd.h" #include "elf-bfd.h"
#include "coff/internal.h" #include "coff/internal.h"
@ -196,7 +196,7 @@ diff -rup binutils.orig/binutils/objcopy.c binutils-2.28/binutils/objcopy.c
+ } + }
+ +
+ if (pnotes[0].namedata[0] != GNU_BUILD_ATTRIBUTE_TYPE_STRING + if (pnotes[0].namedata[0] != GNU_BUILD_ATTRIBUTE_TYPE_STRING
+ || strcmp (pnotes[0].namedata + 2, "1") != 0) + || pnotes[0].namedata[2] != '1')
+ { + {
+ err = _("bad GNU build attribute notes: version note not v1"); + err = _("bad GNU build attribute notes: version note not v1");
+ goto done; + goto done;
@ -502,8 +502,8 @@ diff -rup binutils.orig/binutils/objcopy.c binutils-2.28/binutils/objcopy.c
add_specific_symbol (optarg, strip_specific_htab); add_specific_symbol (optarg, strip_specific_htab);
break; break;
diff -rup binutils.orig/binutils/readelf.c binutils-2.28/binutils/readelf.c diff -rup binutils.orig/binutils/readelf.c binutils-2.28/binutils/readelf.c
--- binutils.orig/binutils/readelf.c 2017-03-03 10:36:54.907749491 +0000 --- binutils.orig/binutils/readelf.c 2017-03-20 17:03:56.164605476 +0000
+++ binutils-2.28/binutils/readelf.c 2017-03-03 10:49:10.247651809 +0000 +++ binutils-2.28/binutils/readelf.c 2017-03-20 17:06:13.368265213 +0000
@@ -15557,6 +15557,10 @@ get_note_type (unsigned e_type) @@ -15557,6 +15557,10 @@ get_note_type (unsigned e_type)
return _("NT_VERSION (version)"); return _("NT_VERSION (version)");
case NT_ARCH: case NT_ARCH:
@ -528,16 +528,16 @@ diff -rup binutils.orig/binutils/readelf.c binutils-2.28/binutils/readelf.c
default: default:
{ {
static char buff[64]; static char buff[64];
@@ -15675,6 +15685,122 @@ get_gnu_elf_note_type (unsigned e_type) @@ -15675,6 +15685,155 @@ get_gnu_elf_note_type (unsigned e_type)
} }
} }
+static void +static void
+decode_x86_isa (unsigned long bitmask) +decode_x86_isa (unsigned int bitmask)
+{ +{
+ while (bitmask) + while (bitmask)
+ { + {
+ unsigned long bit = bitmask & (- bitmask); + unsigned int bit = bitmask & (- bitmask);
+ +
+ bitmask &= ~ bit; + bitmask &= ~ bit;
+ switch (bit) + switch (bit)
@ -560,7 +560,7 @@ diff -rup binutils.orig/binutils/readelf.c binutils-2.28/binutils/readelf.c
+ case GNU_PROPERTY_X86_ISA_1_AVX512VL: printf ("AVX512VL"); break; + case GNU_PROPERTY_X86_ISA_1_AVX512VL: printf ("AVX512VL"); break;
+ case GNU_PROPERTY_X86_ISA_1_AVX512DQ: printf ("AVX512DQ"); break; + case GNU_PROPERTY_X86_ISA_1_AVX512DQ: printf ("AVX512DQ"); break;
+ case GNU_PROPERTY_X86_ISA_1_AVX512BW: printf ("AVX512BW"); break; + case GNU_PROPERTY_X86_ISA_1_AVX512BW: printf ("AVX512BW"); break;
+ default: printf (_("<unknown: %lx>"), bit); break; + default: printf (_("<unknown: %x>"), bit); break;
+ } + }
+ if (bitmask) + if (bitmask)
+ printf (", "); + printf (", ");
@ -576,73 +576,106 @@ diff -rup binutils.orig/binutils/readelf.c binutils-2.28/binutils/readelf.c
+ +
+ printf (_(" Properties: ")); + printf (_(" Properties: "));
+ +
+ if (pnote->descsz % size) + if (pnote->descsz < 8 || (pnote->descsz % size) != 0)
+ { + {
+ printf (_("<corrupt GNU_PROPERTY_TYPE, size = %#lx>\n"), pnote->descsz); + printf (_("<corrupt GNU_PROPERTY_TYPE, size = %#lx>\n"), pnote->descsz);
+ return; + return;
+ } + }
+ +
+ while (ptr < (ptr_end - (size * 2))) + while (1)
+ { + {
+ unsigned long j; + unsigned int j;
+ unsigned long type = byte_get (ptr, size); + unsigned int type = byte_get (ptr, 4);
+ unsigned long datasz = byte_get (ptr + size, size); + unsigned int datasz = byte_get (ptr + 4, 4);
+ +
+ ptr += 2 * size; + ptr += 8;
+ +
+ switch (type) + if ((ptr + datasz) > ptr_end)
+ { + {
+ case GNU_PROPERTY_STACK_SIZE: + printf (_("<corrupt type (%#x) datasz: %#x>\n"),
+ printf (_("stack size: ")); + type, datasz);
+ if (datasz != size || (ptr + size > ptr_end))
+ printf (_("<corrupt length: %#lx> "), datasz);
+ else
+ printf ("%#lx", (unsigned long) byte_get (ptr, size));
+ break;
+
+ case GNU_PROPERTY_NO_COPY_ON_PROTECTED:
+ printf ("no copy on protected ");
+ if (datasz)
+ printf (_("<corrupt length: %#lx> "), datasz);
+ break;
+
+ case GNU_PROPERTY_X86_ISA_1_USED:
+ printf ("x86 ISA used: ");
+ if (datasz != size || (ptr + size > ptr_end))
+ printf (_("<corrupt length: %#lx> "), datasz);
+ else
+ decode_x86_isa (byte_get (ptr, size));
+ break;
+
+ case GNU_PROPERTY_X86_ISA_1_NEEDED:
+ printf ("x86 ISA needed: ");
+ if (datasz != size || (ptr + size > ptr_end))
+ printf (_("<corrupt length: %#lx> "), datasz);
+ else
+ decode_x86_isa (byte_get (ptr, size));
+ break;
+
+ default:
+ printf (_("<unknown type %#lx data: "), type);
+ if (ptr + datasz > ptr_end)
+ {
+ printf (_("corrupt datasz: %#lx>\n"), datasz);
+ break;
+ }
+ for (j = 0; j < datasz; ++j)
+ printf ("%02x ", ptr[j] & 0xff);
+ printf (">");
+ break; + break;
+ } + }
+ +
+ if (type >= GNU_PROPERTY_LOPROC && type <= GNU_PROPERTY_HIPROC)
+ {
+ if (elf_header.e_machine == EM_X86_64
+ || elf_header.e_machine == EM_IAMCU
+ || elf_header.e_machine == EM_386)
+ {
+ switch (type)
+ {
+ case GNU_PROPERTY_X86_ISA_1_USED:
+ printf ("x86 ISA used: ");
+ if (datasz != 4)
+ printf (_("<corrupt length: %#x> "), datasz);
+ else
+ decode_x86_isa (byte_get (ptr, 4));
+ goto next;
+
+ case GNU_PROPERTY_X86_ISA_1_NEEDED:
+ printf ("x86 ISA needed: ");
+ if (datasz != 4)
+ printf (_("<corrupt length: %#x> "), datasz);
+ else
+ decode_x86_isa (byte_get (ptr, 4));
+ goto next;
+
+ default:
+ break;
+ }
+ }
+ }
+ else
+ {
+ switch (type)
+ {
+ case GNU_PROPERTY_STACK_SIZE:
+ printf (_("stack size: "));
+ if (datasz != size)
+ printf (_("<corrupt length: %#x> "), datasz);
+ else
+ printf ("%#lx", (unsigned long) byte_get (ptr, size));
+ goto next;
+
+ case GNU_PROPERTY_NO_COPY_ON_PROTECTED:
+ printf ("no copy on protected ");
+ if (datasz)
+ printf (_("<corrupt length: %#x> "), datasz);
+ goto next;
+
+ default:
+ break;
+ }
+ }
+
+ if (type < GNU_PROPERTY_LOPROC)
+ printf (_("<unknown type %#x data: "), type);
+ else if (type < GNU_PROPERTY_LOUSER)
+ printf (_("<procesor-specific type %#x data: "), type);
+ else
+ printf (_("<application-specific type %#x data: "), type);
+ for (j = 0; j < datasz; ++j)
+ printf ("%02x ", ptr[j] & 0xff);
+ printf (">");
+
+next:
+ ptr += ((datasz + (size - 1)) & ~ (size - 1)); + ptr += ((datasz + (size - 1)) & ~ (size - 1));
+ if (ptr < (ptr_end - (size * 2))) + if (ptr == ptr_end)
+ break;
+ else
+ { + {
+ if (do_wide) + if (do_wide)
+ printf (", "); + printf (", ");
+ else + else
+ printf ("\n\t"); + printf ("\n\t");
+ } + }
+
+ if (ptr > (ptr_end - 8))
+ {
+ printf (_("<corrupt descsz: %#lx>\n"), pnote->descsz);
+ break;
+ }
+ } + }
+ +
+ printf ("\n"); + printf ("\n");
@ -651,7 +684,7 @@ diff -rup binutils.orig/binutils/readelf.c binutils-2.28/binutils/readelf.c
static int static int
print_gnu_note (Elf_Internal_Note *pnote) print_gnu_note (Elf_Internal_Note *pnote)
{ {
@@ -15775,6 +15901,10 @@ print_gnu_note (Elf_Internal_Note *pnote @@ -15775,6 +15934,10 @@ print_gnu_note (Elf_Internal_Note *pnote
} }
break; break;
@ -662,28 +695,149 @@ diff -rup binutils.orig/binutils/readelf.c binutils-2.28/binutils/readelf.c
default: default:
/* Handle unrecognised types. An error message should have already been /* Handle unrecognised types. An error message should have already been
created by get_gnu_elf_note_type(), so all that we need to do is to created by get_gnu_elf_note_type(), so all that we need to do is to
@@ -16164,15 +16294,300 @@ print_ia64_vms_note (Elf_Internal_Note * @@ -16164,15 +16327,370 @@ print_ia64_vms_note (Elf_Internal_Note *
return 1; return 1;
} }
+/* Print the name of the symbol associated with a build attribute
+ that is attached to address OFFSET. */
+
+static bfd_boolean
+print_symbol_for_build_attribute (FILE * file,
+ unsigned long offset,
+ bfd_boolean is_open_attr)
+{
+ static FILE * saved_file = NULL;
+ static char * strtab;
+ static unsigned long strtablen;
+ static Elf_Internal_Sym * symtab;
+ static unsigned long nsyms;
+ Elf_Internal_Sym * saved_sym = NULL;
+ Elf_Internal_Sym * sym;
+
+ if (saved_file == NULL || file != saved_file)
+ {
+ Elf_Internal_Shdr * symsec;
+
+ /* Load the symbol and string sections. */
+ for (symsec = section_headers;
+ symsec < section_headers + elf_header.e_shnum;
+ symsec ++)
+ {
+ if (symsec->sh_type == SHT_SYMTAB)
+ {
+ symtab = GET_ELF_SYMBOLS (file, symsec, & nsyms);
+
+ if (symsec->sh_link < elf_header.e_shnum)
+ {
+ Elf_Internal_Shdr * strtab_sec = section_headers + symsec->sh_link;
+
+ strtab = (char *) get_data (NULL, file, strtab_sec->sh_offset,
+ 1, strtab_sec->sh_size,
+ _("string table"));
+ strtablen = strtab != NULL ? strtab_sec->sh_size : 0;
+ }
+ }
+ }
+ saved_file = file;
+ }
+
+ if (symtab == NULL || strtab == NULL)
+ {
+ printf ("\n");
+ return FALSE;
+ }
+
+ /* Find a symbol whose value matches offset. */
+ for (sym = symtab; sym < symtab + nsyms; sym ++)
+ if (sym->st_value == offset)
+ {
+ if (sym->st_name >= strtablen)
+ /* Huh ? This should not happen. */
+ continue;
+
+ if (strtab[sym->st_name] == 0)
+ continue;
+
+ if (is_open_attr)
+ {
+ /* For OPEN attributes we prefer GLOBAL over LOCAL symbols
+ and FILE or OBJECT symbols over NOTYPE symbols. We skip
+ FUNC symbols entirely. */
+ switch (ELF_ST_TYPE (sym->st_info))
+ {
+ case STT_FILE:
+ saved_sym = sym;
+ /* We can stop searching now. */
+ sym = symtab + nsyms;
+ continue;
+
+ case STT_OBJECT:
+ saved_sym = sym;
+ continue;
+
+ case STT_FUNC:
+ /* Ignore function symbols. */
+ continue;
+
+ default:
+ break;
+ }
+
+ switch (ELF_ST_BIND (sym->st_info))
+ {
+ case STB_GLOBAL:
+ if (saved_sym == NULL
+ || ELF_ST_TYPE (saved_sym->st_info) != STT_OBJECT)
+ saved_sym = sym;
+ break;
+
+ case STB_LOCAL:
+ if (saved_sym == NULL)
+ saved_sym = sym;
+ break;
+
+ default:
+ break;
+ }
+ }
+ else
+ {
+ if (ELF_ST_TYPE (sym->st_info) != STT_FUNC)
+ continue;
+
+ saved_sym = sym;
+ break;
+ }
+ }
+
+ printf (" (%s: %s)\n",
+ is_open_attr ? _("file") : _("func"),
+ saved_sym ? strtab + saved_sym->st_name : _("<no symbol found>)"));
+ return TRUE;
+}
+
+static bfd_boolean +static bfd_boolean
+print_gnu_build_attribute_description (Elf_Internal_Note * pnote, +print_gnu_build_attribute_description (Elf_Internal_Note * pnote,
+ FILE * file, + FILE * file)
+ Elf_Internal_Shdr * section ATTRIBUTE_UNUSED)
+{ +{
+ static unsigned long global_offset = 0; + static unsigned long global_offset = 0;
+ unsigned long i; + unsigned long offset;
+ unsigned long strtab_size = 0; + unsigned int desc_size = is_32bit_elf ? 4 : 8;
+ char * strtab = NULL; + bfd_boolean is_open_attr = pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN;
+ Elf_Internal_Sym * symtab = NULL;
+ unsigned long nsyms = 0;
+ Elf_Internal_Shdr * symsec = NULL;
+ unsigned int desc_size = is_32bit_elf ? 4 : 8;
+ +
+ if (pnote->descsz == 0) + if (pnote->descsz == 0)
+ { + {
+ printf (_(" Applies from offset %#lx\n"), global_offset); + if (is_open_attr)
+ return TRUE; + {
+ printf (_(" Applies from offset %#lx\n"), global_offset);
+ return TRUE;
+ }
+ else
+ {
+ printf (_(" Applies to func at %#lx"), global_offset);
+ return print_symbol_for_build_attribute (file, global_offset, is_open_attr);
+ }
+ } + }
+ +
+ if (pnote->descsz != desc_size) + if (pnote->descsz != desc_size)
@ -693,88 +847,19 @@ diff -rup binutils.orig/binutils/readelf.c binutils-2.28/binutils/readelf.c
+ return FALSE; + return FALSE;
+ } + }
+ +
+ /* Load the symbols. */ + offset = byte_get ((unsigned char *) pnote->descdata, desc_size);
+ for (symsec = section_headers; +
+ symsec < section_headers + elf_header.e_shnum; + if (is_open_attr)
+ symsec ++)
+ { + {
+ if (symsec->sh_type == SHT_SYMTAB) + printf (_(" Applies from offset %#lx"), offset);
+ { + global_offset = offset;
+ symtab = GET_ELF_SYMBOLS (file, symsec, & nsyms); + }
+ + else
+ if (symsec->sh_link < elf_header.e_shnum) + {
+ { + printf (_(" Applies to func at %#lx"), offset);
+ Elf_Internal_Shdr * strtab_sec = section_headers + symsec->sh_link;
+
+ strtab = (char *) get_data (NULL, file, strtab_sec->sh_offset,
+ 1, strtab_sec->sh_size,
+ _("string table"));
+ strtab_size = strtab != NULL ? strtab_sec->sh_size : 0;
+ }
+ }
+ } + }
+ +
+ printf (_(" Applies from offset")); + return print_symbol_for_build_attribute (file, offset, is_open_attr);
+
+ for (i = 0; i < pnote->descsz; i += desc_size)
+ {
+ Elf_Internal_Sym * saved_sym = NULL;
+ Elf_Internal_Sym * sym;
+ unsigned long offset;
+
+ offset = byte_get ((unsigned char *) pnote->descdata + i, desc_size);
+
+ if (i + desc_size == pnote->descsz)
+ printf (_(" %#lx"), offset);
+ else
+ printf (_(" %#lx, "), offset);
+
+ if (pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN)
+ global_offset = offset;
+
+ if (symtab == NULL || strtab == NULL)
+ continue;
+
+ /* Find a symbol whose value matches offset. */
+ for (sym = symtab; sym < symtab + nsyms; sym ++)
+ if (sym->st_value == offset)
+ {
+ if (sym->st_name < strtab_size)
+ {
+ if (strtab[sym->st_name] == 0)
+ continue;
+
+ if (pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN)
+ {
+ /* For OPEN attributes we prefer GLOBAL symbols, if there
+ is one that matches. But keep a record of a matching
+ LOCAL symbol, just in case that is all that we can find. */
+ if (ELF_ST_BIND (sym->st_info) == STB_LOCAL)
+ {
+ saved_sym = sym;
+ continue;
+ }
+ printf (_(" (file: %s)"), strtab + sym->st_name);
+ }
+ else if (ELF_ST_TYPE (sym->st_info) != STT_FUNC)
+ continue;
+ else
+ printf (_(" (function: %s)"), strtab + sym->st_name);
+ break;
+ }
+ }
+
+ if (sym == symtab + nsyms)
+ {
+ if (saved_sym)
+ printf (_(" (file: %s)"), strtab + saved_sym->st_name);
+ else
+ printf (_(" (<symbol name unknown>)"));
+ }
+ }
+
+ printf ("\n");
+ return TRUE;
+} +}
+ +
+static bfd_boolean +static bfd_boolean
@ -821,7 +906,7 @@ diff -rup binutils.orig/binutils/readelf.c binutils-2.28/binutils/readelf.c
+ break; + break;
+ case GNU_BUILD_ATTRIBUTE_STACK_PROT: + case GNU_BUILD_ATTRIBUTE_STACK_PROT:
+ text = _("<stack prot>"); + text = _("<stack prot>");
+ expected_types = "!+"; + expected_types = "!+*";
+ ++ name; + ++ name;
+ break; + break;
+ case GNU_BUILD_ATTRIBUTE_RELRO: + case GNU_BUILD_ATTRIBUTE_RELRO:
@ -849,6 +934,11 @@ diff -rup binutils.orig/binutils/readelf.c binutils-2.28/binutils/readelf.c
+ expected_types = "*"; + expected_types = "*";
+ ++ name; + ++ name;
+ break; + break;
+ case GNU_BUILD_ATTRIBUTE_SHORT_ENUM:
+ text = _("<short enum>");
+ expected_types = "!+";
+ ++ name;
+ break;
+ +
+ default: + default:
+ if (ISPRINT (* name)) + if (ISPRINT (* name))
@ -857,9 +947,9 @@ diff -rup binutils.orig/binutils/readelf.c binutils-2.28/binutils/readelf.c
+ +
+ if (len > left && ! do_wide) + if (len > left && ! do_wide)
+ len = left; + len = left;
+ printf ("%.*s ", len, name); + printf ("%.*s:", len, name);
+ left -= len; + left -= len;
+ name += len + 1; + name += len;
+ } + }
+ else + else
+ { + {
@ -878,7 +968,7 @@ diff -rup binutils.orig/binutils/readelf.c binutils-2.28/binutils/readelf.c
+ } + }
+ +
+ if (strchr (expected_types, name_type) == NULL) + if (strchr (expected_types, name_type) == NULL)
+ warn (_("attribute does not have the expected type\n")); + warn (_("attribute does not have an expected type (%c)\n"), name_type);
+ +
+ if ((unsigned long)(name - pnote->namedata) > pnote->namesz) + if ((unsigned long)(name - pnote->namedata) > pnote->namesz)
+ { + {
@ -895,43 +985,57 @@ diff -rup binutils.orig/binutils/readelf.c binutils-2.28/binutils/readelf.c
+ { + {
+ case GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC: + case GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC:
+ { + {
+ unsigned int bytes = pnote->namesz - (name - pnote->namedata); + unsigned int bytes = pnote->namesz - (name - pnote->namedata);
+ unsigned long val = 0; + unsigned long val = 0;
+ unsigned int shift = 0; + unsigned int shift = 0;
+ char * decoded = NULL;
+ +
+ while (bytes --) + while (bytes --)
+ { + {
+ val |= ((* name ++) << shift); + unsigned long byte = (* name ++) & 0xff;
+
+ val |= byte << shift;
+ shift += 8; + shift += 8;
+ } + }
+ +
+ if (name_attribute == GNU_BUILD_ATTRIBUTE_PIC) + switch (name_attribute)
+ { + {
+ char * pic_type = NULL; + case GNU_BUILD_ATTRIBUTE_PIC:
+
+ switch (val) + switch (val)
+ { + {
+ case 0: pic_type = "static"; break; + case 0: decoded = "static"; break;
+ case 1: pic_type = "pic"; break; + case 1: decoded = "pic"; break;
+ case 2: pic_type = "PIC"; break; + case 2: decoded = "PIC"; break;
+ case 3: pic_type = "pie"; break; + case 3: decoded = "pie"; break;
+ case 4: pic_type = "PIE"; break; + case 4: decoded = "PIE"; break;
+ default: break;
+ } + }
+ + break;
+ if (pic_type != NULL) + case GNU_BUILD_ATTRIBUTE_STACK_PROT:
+ switch (val)
+ { + {
+ if (do_wide) + /* Based upon the SPCT_FLAG_xxx enum values in gcc/cfgexpand.c. */
+ left -= printf ("%s", pic_type); + case 0: decoded = "off"; break;
+ else + case 1: decoded = "on"; break;
+ left -= printf ("%-.*s", left, pic_type); + case 2: decoded = "all"; break;
+ break; + case 3: decoded = "strong"; break;
+ case 4: decoded = "explicit"; break;
+ default: break;
+ } + }
+ break;
+ default:
+ break;
+ } + }
+ +
+ if (do_wide) + if (decoded != NULL)
+ left -= printf ("0x%lx", val); + print_symbol (-left, decoded);
+ else + else
+ left -= printf ("0x%-.*lx", left, val); + {
+ if (do_wide)
+ left -= printf ("0x%lx", val);
+ else
+ left -= printf ("0x%-.*lx", left, val);
+ }
+ } + }
+ break; + break;
+ case GNU_BUILD_ATTRIBUTE_TYPE_STRING: + case GNU_BUILD_ATTRIBUTE_TYPE_STRING:
@ -961,12 +1065,11 @@ diff -rup binutils.orig/binutils/readelf.c binutils-2.28/binutils/readelf.c
- FILE * file ATTRIBUTE_UNUSED, - FILE * file ATTRIBUTE_UNUSED,
- Elf_Internal_Shdr * section ATTRIBUTE_UNUSED) - Elf_Internal_Shdr * section ATTRIBUTE_UNUSED)
+process_note (Elf_Internal_Note * pnote, +process_note (Elf_Internal_Note * pnote,
+ FILE * file, + FILE * file)
+ Elf_Internal_Shdr * section)
{ {
const char * name = pnote->namesz ? pnote->namedata : "(NONE)"; const char * name = pnote->namesz ? pnote->namedata : "(NONE)";
const char * nt; const char * nt;
@@ -16218,8 +16633,17 @@ process_note (Elf_Internal_Note * pnote, @@ -16218,8 +16736,17 @@ process_note (Elf_Internal_Note * pnote,
nt = get_note_type (pnote->type); nt = get_note_type (pnote->type);
printf (" "); printf (" ");
@ -986,13 +1089,13 @@ diff -rup binutils.orig/binutils/readelf.c binutils-2.28/binutils/readelf.c
if (const_strneq (pnote->namedata, "IPF/VMS")) if (const_strneq (pnote->namedata, "IPF/VMS"))
return print_ia64_vms_note (pnote); return print_ia64_vms_note (pnote);
@@ -16229,17 +16653,22 @@ process_note (Elf_Internal_Note * pnote, @@ -16229,17 +16756,22 @@ process_note (Elf_Internal_Note * pnote,
return print_stapsdt_note (pnote); return print_stapsdt_note (pnote);
else if (const_strneq (pnote->namedata, "CORE")) else if (const_strneq (pnote->namedata, "CORE"))
return print_core_note (pnote); return print_core_note (pnote);
+ else if (pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN + else if (pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN
+ || pnote->type == NT_GNU_BUILD_ATTRIBUTE_FUNC) + || pnote->type == NT_GNU_BUILD_ATTRIBUTE_FUNC)
+ return print_gnu_build_attribute_description (pnote, file, section); + return print_gnu_build_attribute_description (pnote, file);
- else if (pnote->descsz) - else if (pnote->descsz)
+ if (pnote->descsz) + if (pnote->descsz)
@ -1011,13 +1114,30 @@ diff -rup binutils.orig/binutils/readelf.c binutils-2.28/binutils/readelf.c
return 1; return 1;
} }
@@ -16369,14 +16901,14 @@ process_notes_at (FILE * fi
break;
}
- strncpy (temp, inote.namedata, inote.namesz);
+ memcpy (temp, inote.namedata, inote.namesz);
temp[inote.namesz] = 0;
/* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
inote.namedata = temp;
}
- res &= process_note (& inote, file, section);
+ res &= process_note (& inote, file);
if (temp != NULL)
{
Only in binutils-2.28/binutils/testsuite/binutils-all: note-2-32.d Only in binutils-2.28/binutils/testsuite/binutils-all: note-2-32.d
Only in binutils-2.28/binutils/testsuite/binutils-all: note-2-32.s Only in binutils-2.28/binutils/testsuite/binutils-all: note-2-32.s
Only in binutils-2.28/binutils/testsuite/binutils-all: note-2-64.d Only in binutils-2.28/binutils/testsuite/binutils-all: note-2-64.d
Only in binutils-2.28/binutils/testsuite/binutils-all: note-2-64.s Only in binutils-2.28/binutils/testsuite/binutils-all: note-2-64.s
diff -rup binutils.orig/binutils/testsuite/binutils-all/objcopy.exp binutils-2.28/binutils/testsuite/binutils-all/objcopy.exp diff -rup binutils.orig/binutils/testsuite/binutils-all/objcopy.exp binutils-2.28/binutils/testsuite/binutils-all/objcopy.exp
--- binutils.orig/binutils/testsuite/binutils-all/objcopy.exp 2017-03-03 10:36:54.973748226 +0000 --- binutils.orig/binutils/testsuite/binutils-all/objcopy.exp 2017-03-20 17:03:56.174605306 +0000
+++ binutils-2.28/binutils/testsuite/binutils-all/objcopy.exp 2017-03-03 10:56:08.251637396 +0000 +++ binutils-2.28/binutils/testsuite/binutils-all/objcopy.exp 2017-03-20 17:04:07.721408353 +0000
@@ -1053,6 +1053,11 @@ if [is_elf_format] { @@ -1053,6 +1053,11 @@ if [is_elf_format] {
run_dump_test "group-6" run_dump_test "group-6"
run_dump_test "copy-1" run_dump_test "copy-1"
@ -1031,8 +1151,8 @@ diff -rup binutils.orig/binutils/testsuite/binutils-all/objcopy.exp binutils-2.2
run_dump_test "copy-2" run_dump_test "copy-2"
diff -rup binutils.orig/include/elf/common.h binutils-2.28/include/elf/common.h diff -rup binutils.orig/include/elf/common.h binutils-2.28/include/elf/common.h
--- binutils.orig/include/elf/common.h 2017-03-03 10:36:57.673696476 +0000 --- binutils.orig/include/elf/common.h 2017-03-20 17:03:56.417601161 +0000
+++ binutils-2.28/include/elf/common.h 2017-03-03 10:38:21.515089483 +0000 +++ binutils-2.28/include/elf/common.h 2017-03-20 17:04:07.733408149 +0000
@@ -538,6 +538,7 @@ @@ -538,6 +538,7 @@
/* #define SHF_MASKOS 0x0F000000 *//* OS-specific semantics */ /* #define SHF_MASKOS 0x0F000000 *//* OS-specific semantics */
@ -1041,7 +1161,7 @@ diff -rup binutils.orig/include/elf/common.h binutils-2.28/include/elf/common.h
#define SHF_MASKPROC 0xF0000000 /* Processor-specific semantics */ #define SHF_MASKPROC 0xF0000000 /* Processor-specific semantics */
/* This used to be implemented as a processor specific section flag. /* This used to be implemented as a processor specific section flag.
@@ -669,6 +670,51 @@ @@ -669,6 +670,62 @@
#define NT_GNU_HWCAP 2 /* Used by ld.so and kernel vDSO. */ #define NT_GNU_HWCAP 2 /* Used by ld.so and kernel vDSO. */
#define NT_GNU_BUILD_ID 3 /* Generated by ld --build-id. */ #define NT_GNU_BUILD_ID 3 /* Generated by ld --build-id. */
#define NT_GNU_GOLD_VERSION 4 /* Generated by gold. */ #define NT_GNU_GOLD_VERSION 4 /* Generated by gold. */
@ -1062,6 +1182,7 @@ diff -rup binutils.orig/include/elf/common.h binutils-2.28/include/elf/common.h
+#define GNU_BUILD_ATTRIBUTE_TOOL 5 +#define GNU_BUILD_ATTRIBUTE_TOOL 5
+#define GNU_BUILD_ATTRIBUTE_ABI 6 +#define GNU_BUILD_ATTRIBUTE_ABI 6
+#define GNU_BUILD_ATTRIBUTE_PIC 7 +#define GNU_BUILD_ATTRIBUTE_PIC 7
+#define GNU_BUILD_ATTRIBUTE_SHORT_ENUM 8
+ +
+#define NOTE_GNU_PROPERTY_SECTION_NAME ".note.gnu.property" +#define NOTE_GNU_PROPERTY_SECTION_NAME ".note.gnu.property"
+#define GNU_BUILD_ATTRS_SECTION_NAME ".gnu.build.attributes" +#define GNU_BUILD_ATTRS_SECTION_NAME ".gnu.build.attributes"
@ -1069,6 +1190,16 @@ diff -rup binutils.orig/include/elf/common.h binutils-2.28/include/elf/common.h
+/* Values used in GNU .note.gnu.property notes (NT_GNU_PROPERTY_TYPE_0). */ +/* Values used in GNU .note.gnu.property notes (NT_GNU_PROPERTY_TYPE_0). */
+#define GNU_PROPERTY_STACK_SIZE 1 +#define GNU_PROPERTY_STACK_SIZE 1
+#define GNU_PROPERTY_NO_COPY_ON_PROTECTED 2 +#define GNU_PROPERTY_NO_COPY_ON_PROTECTED 2
+
+/* Processor-specific semantics, lo */
+#define GNU_PROPERTY_LOPROC 0xc0000000
+/* Processor-specific semantics, hi */
+#define GNU_PROPERTY_HIPROC 0xdfffffff
+/* Application-specific semantics, lo */
+#define GNU_PROPERTY_LOUSER 0xe0000000
+/* Application-specific semantics, hi */
+#define GNU_PROPERTY_HIUSER 0xffffffff
+
+#define GNU_PROPERTY_X86_ISA_1_USED 0xc0000000 +#define GNU_PROPERTY_X86_ISA_1_USED 0xc0000000
+#define GNU_PROPERTY_X86_ISA_1_NEEDED 0xc0000001 +#define GNU_PROPERTY_X86_ISA_1_NEEDED 0xc0000001
+ +
@ -1093,9 +1224,9 @@ diff -rup binutils.orig/include/elf/common.h binutils-2.28/include/elf/common.h
/* Values used in GNU .note.ABI-tag notes (NT_GNU_ABI_TAG). */ /* Values used in GNU .note.ABI-tag notes (NT_GNU_ABI_TAG). */
#define GNU_ABI_TAG_LINUX 0 #define GNU_ABI_TAG_LINUX 0
--- /dev/null 2017-03-03 08:02:17.248891465 +0000 --- /dev/null 2017-03-20 08:02:04.287194455 +0000
+++ binutils-2.28/binutils/testsuite/binutils-all/note-2-32.s 2017-03-03 10:56:46.811898078 +0000 +++ binutils-2.28/binutils/testsuite/binutils-all/note-2-32.s 2017-03-20 17:16:18.922951480 +0000
@@ -0,0 +1,93 @@ @@ -0,0 +1,95 @@
+ .text + .text
+ .org 0x100 + .org 0x100
+ .global note1.s + .global note1.s
@ -1137,6 +1268,8 @@ diff -rup binutils.orig/include/elf/common.h binutils-2.28/include/elf/common.h
+ +
+ .global note2.s + .global note2.s
+note2.s: +note2.s:
+ .type func1, STT_FUNC
+func1:
+ .word 0x100 + .word 0x100
+ +
+ .pushsection .gnu.build.attributes, "0x100000", %note + .pushsection .gnu.build.attributes, "0x100000", %note
@ -1189,8 +1322,8 @@ diff -rup binutils.orig/include/elf/common.h binutils-2.28/include/elf/common.h
+ .popsection + .popsection
+ +
+ +
--- /dev/null 2017-03-03 08:02:17.248891465 +0000 --- /dev/null 2017-03-20 08:02:04.287194455 +0000
+++ binutils-2.28/binutils/testsuite/binutils-all/note-2-32.d 2017-03-03 10:56:46.811898078 +0000 +++ binutils-2.28/binutils/testsuite/binutils-all/note-2-32.d 2017-03-20 17:16:18.922951480 +0000
@@ -0,0 +1,17 @@ @@ -0,0 +1,17 @@
+#PROG: objcopy +#PROG: objcopy
+#readelf: --notes --wide +#readelf: --notes --wide
@ -1207,10 +1340,10 @@ diff -rup binutils.orig/include/elf/common.h binutils-2.28/include/elf/common.h
+[ ]+\*<ABI>0x0[ ]+0x00000000[ ]+NT_GNU_BUILD_ATTRIBUTE_OPEN[ ]+Applies from offset 0x100 +[ ]+\*<ABI>0x0[ ]+0x00000000[ ]+NT_GNU_BUILD_ATTRIBUTE_OPEN[ ]+Applies from offset 0x100
+[ ]+\$<version>1[ ]+0x00000004[ ]+NT_GNU_BUILD_ATTRIBUTE_OPEN[ ]+Applies from offset 0x10. \(file: note2.s\) +[ ]+\$<version>1[ ]+0x00000004[ ]+NT_GNU_BUILD_ATTRIBUTE_OPEN[ ]+Applies from offset 0x10. \(file: note2.s\)
+[ ]+!<stack prot>false[ ]+0x00000000[ ]+NT_GNU_BUILD_ATTRIBUTE_OPEN[ ]+Applies from offset 0x10. +[ ]+!<stack prot>false[ ]+0x00000000[ ]+NT_GNU_BUILD_ATTRIBUTE_OPEN[ ]+Applies from offset 0x10.
+[ ]+\*<PIC>pic[ ]+0x00000000[ ]+NT_GNU_BUILD_ATTRIBUTE_FUNC[ ]+Applies from offset 0x10. +[ ]+\*<PIC>pic[ ]+0x00000000[ ]+NT_GNU_BUILD_ATTRIBUTE_FUNC[ ]+Applies to func at 0x10. \(func: func1\)
+#... +#...
--- /dev/null 2017-03-03 08:02:17.248891465 +0000 --- /dev/null 2017-03-20 08:02:04.287194455 +0000
+++ binutils-2.28/binutils/testsuite/binutils-all/note-2-64.d 2017-03-03 10:56:52.235794085 +0000 +++ binutils-2.28/binutils/testsuite/binutils-all/note-2-64.d 2017-03-20 17:16:18.922951480 +0000
@@ -0,0 +1,17 @@ @@ -0,0 +1,17 @@
+#PROG: objcopy +#PROG: objcopy
+#readelf: --notes --wide +#readelf: --notes --wide
@ -1227,11 +1360,11 @@ diff -rup binutils.orig/include/elf/common.h binutils-2.28/include/elf/common.h
+[ ]+\*<ABI>0x0[ ]+0x00000000[ ]+NT_GNU_BUILD_ATTRIBUTE_OPEN[ ]+Applies from offset 0x100 +[ ]+\*<ABI>0x0[ ]+0x00000000[ ]+NT_GNU_BUILD_ATTRIBUTE_OPEN[ ]+Applies from offset 0x100
+[ ]+\$<version>1[ ]+0x00000008[ ]+NT_GNU_BUILD_ATTRIBUTE_OPEN[ ]+Applies from offset 0x10. \(file: note2.s\) +[ ]+\$<version>1[ ]+0x00000008[ ]+NT_GNU_BUILD_ATTRIBUTE_OPEN[ ]+Applies from offset 0x10. \(file: note2.s\)
+[ ]+!<stack prot>false[ ]+0x00000000[ ]+NT_GNU_BUILD_ATTRIBUTE_OPEN[ ]+Applies from offset 0x10. +[ ]+!<stack prot>false[ ]+0x00000000[ ]+NT_GNU_BUILD_ATTRIBUTE_OPEN[ ]+Applies from offset 0x10.
+[ ]+\*<PIC>pic[ ]+0x00000000[ ]+NT_GNU_BUILD_ATTRIBUTE_FUNC[ ]+Applies from offset 0x10. +[ ]+\*<PIC>pic[ ]+0x00000000[ ]+NT_GNU_BUILD_ATTRIBUTE_FUNC[ ]+Applies to func at 0x10. \(func: func1\)
+#... +#...
--- /dev/null 2017-03-03 08:02:17.248891465 +0000 --- /dev/null 2017-03-20 08:02:04.287194455 +0000
+++ binutils-2.28/binutils/testsuite/binutils-all/note-2-64.s 2017-03-03 10:56:52.235794085 +0000 +++ binutils-2.28/binutils/testsuite/binutils-all/note-2-64.s 2017-03-20 17:16:18.922951480 +0000
@@ -0,0 +1,94 @@ @@ -0,0 +1,97 @@
+ .text + .text
+ .org 0x100 + .org 0x100
+ .global note1.s + .global note1.s
@ -1273,8 +1406,11 @@ diff -rup binutils.orig/include/elf/common.h binutils-2.28/include/elf/common.h
+ +
+ .global note2.s + .global note2.s
+note2.s: +note2.s:
+ .global func1
+ .type func1, STT_FUNC
+func1:
+ .word 0x100 + .word 0x100
+ +
+ .pushsection .gnu.build.attributes, "0x100000", %note + .pushsection .gnu.build.attributes, "0x100000", %note
+ .dc.l 4 + .dc.l 4
+ .dc.l 8 + .dc.l 8
@ -1326,25 +1462,3 @@ diff -rup binutils.orig/include/elf/common.h binutils-2.28/include/elf/common.h
+ .popsection + .popsection
+ +
+ +
--- binutils.orig/binutils/readelf.c 2017-03-06 16:55:38.741902216 +0000
+++ binutils-2.28/binutils/readelf.c 2017-03-06 16:55:50.435746360 +0000
@@ -16529,7 +16529,9 @@ print_gnu_build_attribute_name (Elf_Inte
while (bytes --)
{
- val |= ((* name ++) << shift);
+ unsigned long byte = (* name ++) & 0xff;
+
+ val |= byte << shift;
shift += 8;
}
@@ -16798,7 +16800,7 @@ process_notes_at (FILE * fi
break;
}
- strncpy (temp, inote.namedata, inote.namesz);
+ memcpy (temp, inote.namedata, inote.namesz);
temp[inote.namesz] = 0;
/* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */

View File

@ -43,7 +43,7 @@
Summary: A GNU collection of binary utilities Summary: A GNU collection of binary utilities
Name: %{?cross}binutils%{?_with_debug:-debug} Name: %{?cross}binutils%{?_with_debug:-debug}
Version: 2.28 Version: 2.28
Release: 4%{?dist} Release: 5%{?dist}
License: GPLv3+ License: GPLv3+
Group: Development/Tools Group: Development/Tools
URL: http://sources.redhat.com/binutils URL: http://sources.redhat.com/binutils
@ -87,6 +87,8 @@ Patch17: binutils-gnu-build-notes.patch
Patch18: binutils-2.28-gas-comp_dir.patch Patch18: binutils-2.28-gas-comp_dir.patch
# Import fix for PR 21124 and 20519 # Import fix for PR 21124 and 20519
Patch19: binutils-2.28-ppc-dynamic-relocs.patch Patch19: binutils-2.28-ppc-dynamic-relocs.patch
# Have readelf skip checks of the dynamic section when its type is SHT_NOBITS.
Patch20: binutils-2.28-dynamic-section-warning.patch
Provides: bundled(libiberty) Provides: bundled(libiberty)
@ -227,6 +229,7 @@ using libelf instead of BFD.
%patch17 -p1 %patch17 -p1
%patch18 -p1 %patch18 -p1
%patch19 -p1 %patch19 -p1
%patch20 -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.
@ -593,6 +596,11 @@ exit 0
%endif # %{isnative} %endif # %{isnative}
%changelog %changelog
* Mon Mar 20 2017 Nick Clifton <nickc@redhat.com> 2.28-5
- Update GNU BUILD NOTES patch.
- Import FSF binutils patch to fix running readelf on debug info binaries.
(#1434050)
* Wed Mar 08 2017 Nick Clifton <nickc@redhat.com> 2.28-4 * Wed Mar 08 2017 Nick Clifton <nickc@redhat.com> 2.28-4
- Update GNU BUILD NOTES patch. - Update GNU BUILD NOTES patch.
- Import FSF binutils patch to fix an abort with PowerPC dynamic relocs. - Import FSF binutils patch to fix an abort with PowerPC dynamic relocs.