X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=binutils%2Freadelf.c;h=8192686f7e671f5cfeb8bf3ffe785ecfd2975c72;hb=a693765e23934996abbe4e44c4ba28eabdece4f9;hp=7c5a0266bddf92162b1d915be051926a17fffb67;hpb=67ce483baa43121a17195efe4b14a183e9fd8232;p=binutils-gdb.git diff --git a/binutils/readelf.c b/binutils/readelf.c index 7c5a0266bdd..8192686f7e6 100644 --- a/binutils/readelf.c +++ b/binutils/readelf.c @@ -98,6 +98,7 @@ #include "elf/cr16.h" #include "elf/cris.h" #include "elf/crx.h" +#include "elf/csky.h" #include "elf/d10v.h" #include "elf/d30v.h" #include "elf/dlx.h" @@ -797,6 +798,7 @@ guess_is_rela (unsigned int e_machine) case EM_CR16: case EM_CRIS: case EM_CRX: + case EM_CSKY: case EM_D30V: case EM_CYGNUS_D30V: case EM_FR30: @@ -1348,6 +1350,10 @@ dump_relocations (Filedata * filedata, rtype = elf_frv_reloc_type (type); break; + case EM_CSKY: + rtype = elf_csky_reloc_type (type); + break; + case EM_FT32: rtype = elf_ft32_reloc_type (type); break; @@ -2501,6 +2507,7 @@ get_machine_name (unsigned e_machine) case EM_ADAPTEVA_EPIPHANY: return "Adapteva EPIPHANY"; case EM_CYGNUS_FRV: return "Fujitsu FR-V"; case EM_S12Z: return "Freescale S12Z"; + case EM_CSKY: return "C-SKY"; default: snprintf (buff, sizeof (buff), _(": 0x%x"), e_machine); @@ -4758,12 +4765,12 @@ process_file_header (Filedata * filedata) get_elf_class (header->e_ident[EI_CLASS])); printf (_(" Data: %s\n"), get_data_encoding (header->e_ident[EI_DATA])); - printf (_(" Version: %d %s\n"), + printf (_(" Version: %d%s\n"), header->e_ident[EI_VERSION], (header->e_ident[EI_VERSION] == EV_CURRENT - ? "(current)" + ? _(" (current)") : (header->e_ident[EI_VERSION] != EV_NONE - ? _("") + ? _(" ") : ""))); printf (_(" OS/ABI: %s\n"), get_osabi_name (filedata, header->e_ident[EI_OSABI])); @@ -4774,45 +4781,57 @@ process_file_header (Filedata * filedata) printf (_(" Machine: %s\n"), get_machine_name (header->e_machine)); printf (_(" Version: 0x%lx\n"), - (unsigned long) header->e_version); + header->e_version); printf (_(" Entry point address: ")); - print_vma ((bfd_vma) header->e_entry, PREFIX_HEX); + print_vma (header->e_entry, PREFIX_HEX); printf (_("\n Start of program headers: ")); - print_vma ((bfd_vma) header->e_phoff, DEC); + print_vma (header->e_phoff, DEC); printf (_(" (bytes into file)\n Start of section headers: ")); - print_vma ((bfd_vma) header->e_shoff, DEC); + print_vma (header->e_shoff, DEC); printf (_(" (bytes into file)\n")); printf (_(" Flags: 0x%lx%s\n"), - (unsigned long) header->e_flags, + header->e_flags, get_machine_flags (filedata, header->e_flags, header->e_machine)); - printf (_(" Size of this header: %ld (bytes)\n"), - (long) header->e_ehsize); - printf (_(" Size of program headers: %ld (bytes)\n"), - (long) header->e_phentsize); - printf (_(" Number of program headers: %ld"), - (long) header->e_phnum); + printf (_(" Size of this header: %u (bytes)\n"), + header->e_ehsize); + printf (_(" Size of program headers: %u (bytes)\n"), + header->e_phentsize); + printf (_(" Number of program headers: %u"), + header->e_phnum); if (filedata->section_headers != NULL && header->e_phnum == PN_XNUM && filedata->section_headers[0].sh_info != 0) - printf (" (%ld)", (long) filedata->section_headers[0].sh_info); + { + header->e_phnum = filedata->section_headers[0].sh_info; + printf (" (%u)", header->e_phnum); + } putc ('\n', stdout); - printf (_(" Size of section headers: %ld (bytes)\n"), - (long) header->e_shentsize); - printf (_(" Number of section headers: %ld"), - (long) header->e_shnum); + printf (_(" Size of section headers: %u (bytes)\n"), + header->e_shentsize); + printf (_(" Number of section headers: %u"), + header->e_shnum); if (filedata->section_headers != NULL && header->e_shnum == SHN_UNDEF) - printf (" (%ld)", (long) filedata->section_headers[0].sh_size); + { + header->e_shnum = filedata->section_headers[0].sh_size; + printf (" (%u)", header->e_shnum); + } putc ('\n', stdout); - printf (_(" Section header string table index: %ld"), - (long) header->e_shstrndx); + printf (_(" Section header string table index: %u"), + header->e_shstrndx); if (filedata->section_headers != NULL && header->e_shstrndx == (SHN_XINDEX & 0xffff)) - printf (" (%u)", filedata->section_headers[0].sh_link); - else if (header->e_shstrndx != SHN_UNDEF - && header->e_shstrndx >= header->e_shnum) - printf (_(" ")); + { + header->e_shstrndx = filedata->section_headers[0].sh_link; + printf (" (%u)", header->e_shstrndx); + } + if (header->e_shstrndx != SHN_UNDEF + && header->e_shstrndx >= header->e_shnum) + { + header->e_shstrndx = SHN_UNDEF; + printf (_(" ")); + } putc ('\n', stdout); } @@ -5330,6 +5349,7 @@ get_32bit_section_headers (Filedata * filedata, bfd_boolean probe) { if (!probe) error (_("Out of memory reading %u section headers\n"), num); + free (shdrs); return FALSE; } @@ -5396,6 +5416,7 @@ get_64bit_section_headers (Filedata * filedata, bfd_boolean probe) { if (! probe) error (_("Out of memory reading %u section headers\n"), num); + free (shdrs); return FALSE; } @@ -5434,6 +5455,7 @@ get_32bit_elf_symbols (Filedata * filedata, Elf_Internal_Sym * isyms = NULL; Elf_Internal_Sym * psym; unsigned int j; + elf_section_list * entry; if (section->sh_size == 0) { @@ -5475,30 +5497,35 @@ get_32bit_elf_symbols (Filedata * filedata, if (esyms == NULL) goto exit_point; - { - elf_section_list * entry; - - shndx = NULL; - for (entry = symtab_shndx_list; entry != NULL; entry = entry->next) - if (entry->hdr->sh_link == (unsigned long) (section - filedata->section_headers)) - { - shndx = (Elf_External_Sym_Shndx *) get_data (NULL, filedata, - entry->hdr->sh_offset, - 1, entry->hdr->sh_size, - _("symbol table section indices")); - if (shndx == NULL) - goto exit_point; - /* PR17531: file: heap-buffer-overflow */ - else if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number) - { - error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"), - printable_section_name (filedata, entry->hdr), - (unsigned long) entry->hdr->sh_size, - (unsigned long) section->sh_size); - goto exit_point; - } + shndx = NULL; + for (entry = symtab_shndx_list; entry != NULL; entry = entry->next) + { + if (entry->hdr->sh_link != (unsigned long) (section - filedata->section_headers)) + continue; + + if (shndx != NULL) + { + error (_("Multiple symbol table index sections associated with the same symbol section\n")); + free (shndx); } - } + + shndx = (Elf_External_Sym_Shndx *) get_data (NULL, filedata, + entry->hdr->sh_offset, + 1, entry->hdr->sh_size, + _("symbol table section indices")); + if (shndx == NULL) + goto exit_point; + + /* PR17531: file: heap-buffer-overflow */ + if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number) + { + error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"), + printable_section_name (filedata, entry->hdr), + (unsigned long) entry->hdr->sh_size, + (unsigned long) section->sh_size); + goto exit_point; + } + } isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym)); @@ -5525,10 +5552,8 @@ get_32bit_elf_symbols (Filedata * filedata, } exit_point: - if (shndx != NULL) - free (shndx); - if (esyms != NULL) - free (esyms); + free (shndx); + free (esyms); if (num_syms_return != NULL) * num_syms_return = isyms == NULL ? 0 : number; @@ -5547,6 +5572,7 @@ get_64bit_elf_symbols (Filedata * filedata, Elf_Internal_Sym * isyms = NULL; Elf_Internal_Sym * psym; unsigned int j; + elf_section_list * entry; if (section->sh_size == 0) { @@ -5588,30 +5614,35 @@ get_64bit_elf_symbols (Filedata * filedata, if (!esyms) goto exit_point; - { - elf_section_list * entry; - - shndx = NULL; - for (entry = symtab_shndx_list; entry != NULL; entry = entry->next) - if (entry->hdr->sh_link == (unsigned long) (section - filedata->section_headers)) - { - shndx = (Elf_External_Sym_Shndx *) get_data (NULL, filedata, - entry->hdr->sh_offset, - 1, entry->hdr->sh_size, - _("symbol table section indices")); - if (shndx == NULL) - goto exit_point; - /* PR17531: file: heap-buffer-overflow */ - else if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number) - { - error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"), - printable_section_name (filedata, entry->hdr), - (unsigned long) entry->hdr->sh_size, - (unsigned long) section->sh_size); - goto exit_point; - } + shndx = NULL; + for (entry = symtab_shndx_list; entry != NULL; entry = entry->next) + { + if (entry->hdr->sh_link != (unsigned long) (section - filedata->section_headers)) + continue; + + if (shndx != NULL) + { + error (_("Multiple symbol table index sections associated with the same symbol section\n")); + free (shndx); } - } + + shndx = (Elf_External_Sym_Shndx *) get_data (NULL, filedata, + entry->hdr->sh_offset, + 1, entry->hdr->sh_size, + _("symbol table section indices")); + if (shndx == NULL) + goto exit_point; + + /* PR17531: file: heap-buffer-overflow */ + if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number) + { + error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"), + printable_section_name (filedata, entry->hdr), + (unsigned long) entry->hdr->sh_size, + (unsigned long) section->sh_size); + goto exit_point; + } + } isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym)); @@ -5640,10 +5671,8 @@ get_64bit_elf_symbols (Filedata * filedata, } exit_point: - if (shndx != NULL) - free (shndx); - if (esyms != NULL) - free (esyms); + free (shndx); + free (esyms); if (num_syms_return != NULL) * num_syms_return = isyms == NULL ? 0 : number; @@ -8113,8 +8142,8 @@ hppa_process_unwind (Filedata * filedata) if (! slurp_hppa_unwind_table (filedata, &aux, sec)) res = FALSE; - - if (aux.table_len > 0) + + if (res && aux.table_len > 0) { if (! dump_hppa_unwind (filedata, &aux)) res = FALSE; @@ -9672,6 +9701,11 @@ process_dynamic_section (Filedata * filedata) section.sh_entsize = sizeof (Elf64_External_Sym); section.sh_name = filedata->string_table_length; + if (dynamic_symbols != NULL) + { + error (_("Multiple dynamic symbol table sections found\n")); + free (dynamic_symbols); + } dynamic_symbols = GET_ELF_SYMBOLS (filedata, §ion, & num_dynamic_syms); if (num_dynamic_syms < 1) { @@ -9715,11 +9749,16 @@ process_dynamic_section (Filedata * filedata) continue; } + if (dynamic_strings != NULL) + { + error (_("Multiple dynamic string tables found\n")); + free (dynamic_strings); + } + dynamic_strings = (char *) get_data (NULL, filedata, offset, 1, str_tab_len, _("dynamic string table")); dynamic_strings_length = dynamic_strings == NULL ? 0 : str_tab_len; - break; } } @@ -9762,6 +9801,11 @@ process_dynamic_section (Filedata * filedata) if (!extsyminfo) return FALSE; + if (dynamic_syminfo != NULL) + { + error (_("Multiple dynamic symbol information sections found\n")); + free (dynamic_syminfo); + } dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz); if (dynamic_syminfo == NULL) { @@ -11044,11 +11088,16 @@ get_ia64_symbol_other (Filedata * filedata, unsigned int other) static const char * get_ppc64_symbol_other (unsigned int other) { - if (PPC64_LOCAL_ENTRY_OFFSET (other) != 0) + if ((other & ~STO_PPC64_LOCAL_MASK) != 0) + return NULL; + + other >>= STO_PPC64_LOCAL_BIT; + if (other <= 6) { static char buf[32]; - snprintf (buf, sizeof buf, _(": %d"), - PPC64_LOCAL_ENTRY_OFFSET (other)); + if (other >= 2) + other = ppc64_decode_local_entry (other); + snprintf (buf, sizeof buf, _(": %d"), other); return buf; } return NULL; @@ -11251,6 +11300,7 @@ get_symbol_version_string (Filedata * filedata, unsigned char data[2]; unsigned short vers_data; unsigned long offset; + unsigned short max_vd_ndx; if (!is_dynsym || version_info[DT_VERSIONTAGIDX (DT_VERSYM)] == 0) @@ -11268,6 +11318,8 @@ get_symbol_version_string (Filedata * filedata, if ((vers_data & VERSYM_HIDDEN) == 0 && vers_data == 0) return NULL; + max_vd_ndx = 0; + /* Usually we'd only see verdef for defined symbols, and verneed for undefined symbols. However, symbols defined by the linker in .dynbss for variables copied from a shared library in order to @@ -11310,6 +11362,9 @@ get_symbol_version_string (Filedata * filedata, ivd.vd_flags = BYTE_GET (evd.vd_flags); } + if ((ivd.vd_ndx & VERSYM_VERSION) > max_vd_ndx) + max_vd_ndx = ivd.vd_ndx & VERSYM_VERSION; + off += ivd.vd_next; } while (ivd.vd_ndx != (vers_data & VERSYM_VERSION) && ivd.vd_next != 0); @@ -11401,6 +11456,9 @@ get_symbol_version_string (Filedata * filedata, return (ivna.vna_name < strtab_size ? strtab + ivna.vna_name : _("")); } + else if ((max_vd_ndx || (vers_data & VERSYM_VERSION) != 1) + && (vers_data & VERSYM_VERSION) > max_vd_ndx) + return _(""); } return NULL; } @@ -12282,6 +12340,8 @@ is_32bit_abs_reloc (Filedata * filedata, unsigned int reloc_type) return reloc_type == 3; /* R_CR16_NUM32. */ case EM_CRX: return reloc_type == 15; /* R_CRX_NUM32. */ + case EM_CSKY: + return reloc_type == 1; /* R_CKCORE_ADDR32. */ case EM_CYGNUS_FRV: return reloc_type == 1; case EM_CYGNUS_D10V: @@ -14212,6 +14272,12 @@ display_arc_attribute (unsigned char * p, printf (" Tag_ARC_ISA_mpy_option: %d\n", val); break; + case Tag_ARC_ATR_version: + val = read_uleb128 (p, &len, end); + p += len; + printf (" Tag_ARC_ATR_version: %d\n", val); + break; + default: return display_tag_value (tag & 1, p, end); } @@ -15585,6 +15651,12 @@ print_mips_ases (unsigned int mask) fputs ("\n\tGINV ASE", stdout); if (mask & AFL_ASE_LOONGSON_MMI) fputs ("\n\tLoongson MMI ASE", stdout); + if (mask & AFL_ASE_LOONGSON_CAM) + fputs ("\n\tLoongson CAM ASE", stdout); + if (mask & AFL_ASE_LOONGSON_EXT) + fputs ("\n\tLoongson EXT ASE", stdout); + if (mask & AFL_ASE_LOONGSON_EXT2) + fputs ("\n\tLoongson EXT2 ASE", stdout); if (mask == 0) fprintf (stdout, "\n\t%s", _("None")); else if ((mask & ~AFL_ASE_MASK) != 0) @@ -16889,9 +16961,90 @@ get_gnu_elf_note_type (unsigned e_type) } } +static void +decode_x86_compat_isa (unsigned int bitmask) +{ + while (bitmask) + { + unsigned int bit = bitmask & (- bitmask); + + bitmask &= ~ bit; + switch (bit) + { + case GNU_PROPERTY_X86_COMPAT_ISA_1_486: + printf ("i486"); + break; + case GNU_PROPERTY_X86_COMPAT_ISA_1_586: + printf ("586"); + break; + case GNU_PROPERTY_X86_COMPAT_ISA_1_686: + printf ("686"); + break; + case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE: + printf ("SSE"); + break; + case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE2: + printf ("SSE2"); + break; + case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE3: + printf ("SSE3"); + break; + case GNU_PROPERTY_X86_COMPAT_ISA_1_SSSE3: + printf ("SSSE3"); + break; + case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE4_1: + printf ("SSE4_1"); + break; + case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE4_2: + printf ("SSE4_2"); + break; + case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX: + printf ("AVX"); + break; + case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX2: + printf ("AVX2"); + break; + case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512F: + printf ("AVX512F"); + break; + case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512CD: + printf ("AVX512CD"); + break; + case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512ER: + printf ("AVX512ER"); + break; + case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512PF: + printf ("AVX512PF"); + break; + case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512VL: + printf ("AVX512VL"); + break; + case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512DQ: + printf ("AVX512DQ"); + break; + case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512BW: + printf ("AVX512BW"); + break; + default: + printf (_(""), bit); + break; + } + if (bitmask) + printf (", "); + } +} + static void decode_x86_isa (unsigned int bitmask) { + if (bitmask == GNU_PROPERTY_X86_UINT32_VALID) + { + printf (_("")); + return; + } + else + bitmask &= ~GNU_PROPERTY_X86_UINT32_VALID; + while (bitmask) { unsigned int bit = bitmask & (- bitmask); @@ -16899,25 +17052,81 @@ decode_x86_isa (unsigned int bitmask) bitmask &= ~ bit; switch (bit) { - case GNU_PROPERTY_X86_ISA_1_486: printf ("i486"); break; - case GNU_PROPERTY_X86_ISA_1_586: printf ("586"); break; - case GNU_PROPERTY_X86_ISA_1_686: printf ("686"); break; - case GNU_PROPERTY_X86_ISA_1_SSE: printf ("SSE"); break; - case GNU_PROPERTY_X86_ISA_1_SSE2: printf ("SSE2"); break; - case GNU_PROPERTY_X86_ISA_1_SSE3: printf ("SSE3"); break; - case GNU_PROPERTY_X86_ISA_1_SSSE3: printf ("SSSE3"); break; - case GNU_PROPERTY_X86_ISA_1_SSE4_1: printf ("SSE4_1"); break; - case GNU_PROPERTY_X86_ISA_1_SSE4_2: printf ("SSE4_2"); break; - case GNU_PROPERTY_X86_ISA_1_AVX: printf ("AVX"); break; - case GNU_PROPERTY_X86_ISA_1_AVX2: printf ("AVX2"); break; - case GNU_PROPERTY_X86_ISA_1_AVX512F: printf ("AVX512F"); break; - case GNU_PROPERTY_X86_ISA_1_AVX512CD: printf ("AVX512CD"); break; - case GNU_PROPERTY_X86_ISA_1_AVX512ER: printf ("AVX512ER"); break; - case GNU_PROPERTY_X86_ISA_1_AVX512PF: printf ("AVX512PF"); 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_AVX512BW: printf ("AVX512BW"); break; - default: printf (_(""), bit); break; + case GNU_PROPERTY_X86_ISA_1_CMOV: + printf ("CMOV"); + break; + case GNU_PROPERTY_X86_ISA_1_SSE: + printf ("SSE"); + break; + case GNU_PROPERTY_X86_ISA_1_SSE2: + printf ("SSE2"); + break; + case GNU_PROPERTY_X86_ISA_1_SSE3: + printf ("SSE3"); + break; + case GNU_PROPERTY_X86_ISA_1_SSSE3: + printf ("SSSE3"); + break; + case GNU_PROPERTY_X86_ISA_1_SSE4_1: + printf ("SSE4_1"); + break; + case GNU_PROPERTY_X86_ISA_1_SSE4_2: + printf ("SSE4_2"); + break; + case GNU_PROPERTY_X86_ISA_1_AVX: + printf ("AVX"); + break; + case GNU_PROPERTY_X86_ISA_1_AVX2: + printf ("AVX2"); + break; + case GNU_PROPERTY_X86_ISA_1_FMA: + printf ("FMA"); + break; + case GNU_PROPERTY_X86_ISA_1_AVX512F: + printf ("AVX512F"); + break; + case GNU_PROPERTY_X86_ISA_1_AVX512CD: + printf ("AVX512CD"); + break; + case GNU_PROPERTY_X86_ISA_1_AVX512ER: + printf ("AVX512ER"); + break; + case GNU_PROPERTY_X86_ISA_1_AVX512PF: + printf ("AVX512PF"); + 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_AVX512BW: + printf ("AVX512BW"); + break; + case GNU_PROPERTY_X86_ISA_1_AVX512_4FMAPS: + printf ("AVX512_4FMAPS"); + break; + case GNU_PROPERTY_X86_ISA_1_AVX512_4VNNIW: + printf ("AVX512_4VNNIW"); + break; + case GNU_PROPERTY_X86_ISA_1_AVX512_BITALG: + printf ("AVX512_BITALG"); + break; + case GNU_PROPERTY_X86_ISA_1_AVX512_IFMA: + printf ("AVX512_IFMA"); + break; + case GNU_PROPERTY_X86_ISA_1_AVX512_VBMI: + printf ("AVX512_VBMI"); + break; + case GNU_PROPERTY_X86_ISA_1_AVX512_VBMI2: + printf ("AVX512_VBMI2"); + break; + case GNU_PROPERTY_X86_ISA_1_AVX512_VNNI: + printf ("AVX512_VNNI"); + break; + default: + printf (_(""), bit); + break; } if (bitmask) printf (", "); @@ -16925,8 +17134,16 @@ decode_x86_isa (unsigned int bitmask) } static void -decode_x86_feature (unsigned int type, unsigned int bitmask) +decode_x86_feature_1 (unsigned int bitmask) { + if (bitmask == GNU_PROPERTY_X86_UINT32_VALID) + { + printf (_("")); + return; + } + else + bitmask &= ~GNU_PROPERTY_X86_UINT32_VALID; + while (bitmask) { unsigned int bit = bitmask & (- bitmask); @@ -16935,26 +17152,67 @@ decode_x86_feature (unsigned int type, unsigned int bitmask) switch (bit) { case GNU_PROPERTY_X86_FEATURE_1_IBT: - switch (type) - { - case GNU_PROPERTY_X86_FEATURE_1_AND: - printf ("IBT"); - break; - default: - /* This should never happen. */ - abort (); - } + printf ("IBT"); break; case GNU_PROPERTY_X86_FEATURE_1_SHSTK: - switch (type) - { - case GNU_PROPERTY_X86_FEATURE_1_AND: - printf ("SHSTK"); - break; - default: - /* This should never happen. */ - abort (); - } + printf ("SHSTK"); + break; + default: + printf (_(""), bit); + break; + } + if (bitmask) + printf (", "); + } +} + +static void +decode_x86_feature_2 (unsigned int bitmask) +{ + if (bitmask == GNU_PROPERTY_X86_UINT32_VALID) + { + printf (_("")); + return; + } + else + bitmask &= ~GNU_PROPERTY_X86_UINT32_VALID; + + while (bitmask) + { + unsigned int bit = bitmask & (- bitmask); + + bitmask &= ~ bit; + switch (bit) + { + case GNU_PROPERTY_X86_FEATURE_2_X86: + printf ("x86"); + break; + case GNU_PROPERTY_X86_FEATURE_2_X87: + printf ("x87"); + break; + case GNU_PROPERTY_X86_FEATURE_2_MMX: + printf ("MMX"); + break; + case GNU_PROPERTY_X86_FEATURE_2_XMM: + printf ("XMM"); + break; + case GNU_PROPERTY_X86_FEATURE_2_YMM: + printf ("YMM"); + break; + case GNU_PROPERTY_X86_FEATURE_2_ZMM: + printf ("ZMM"); + break; + case GNU_PROPERTY_X86_FEATURE_2_FXSR: + printf ("FXSR"); + break; + case GNU_PROPERTY_X86_FEATURE_2_XSAVE: + printf ("XSAVE"); + break; + case GNU_PROPERTY_X86_FEATURE_2_XSAVEOPT: + printf ("XSAVEOPT"); + break; + case GNU_PROPERTY_X86_FEATURE_2_XSAVEC: + printf ("XSAVEC"); break; default: printf (_(""), bit); @@ -17010,30 +17268,95 @@ print_gnu_property_note (Filedata * filedata, Elf_Internal_Note * pnote) || filedata->file_header.e_machine == EM_IAMCU || filedata->file_header.e_machine == EM_386) { + unsigned int bitmask; + + if (datasz == 4) + { + bitmask = byte_get (ptr, 4); + if ((filedata->file_header.e_type == ET_EXEC + || filedata->file_header.e_type == ET_DYN) + && !(bitmask & GNU_PROPERTY_X86_UINT32_VALID)) + printf ("Invalid "); + } + else + bitmask = 0; + switch (type) { case GNU_PROPERTY_X86_ISA_1_USED: - printf ("x86 ISA used: "); if (datasz != 4) - printf (_(" "), datasz); + printf (_("x86 ISA used: "), + datasz); else - decode_x86_isa (byte_get (ptr, 4)); + { + printf ("x86 ISA used: "); + decode_x86_isa (bitmask); + } goto next; case GNU_PROPERTY_X86_ISA_1_NEEDED: - printf ("x86 ISA needed: "); if (datasz != 4) - printf (_(" "), datasz); + printf (_("x86 ISA needed: "), + datasz); else - decode_x86_isa (byte_get (ptr, 4)); + { + printf ("x86 ISA needed: "); + decode_x86_isa (bitmask); + } goto next; case GNU_PROPERTY_X86_FEATURE_1_AND: - printf ("x86 feature: "); if (datasz != 4) - printf (_(" "), datasz); + printf (_("x86 feature: "), + datasz); else - decode_x86_feature (type, byte_get (ptr, 4)); + { + printf ("x86 feature: "); + decode_x86_feature_1 (bitmask); + } + goto next; + + case GNU_PROPERTY_X86_FEATURE_2_USED: + if (datasz != 4) + printf (_("x86 feature used: "), + datasz); + else + { + printf ("x86 feature used: "); + decode_x86_feature_2 (bitmask); + } + goto next; + + case GNU_PROPERTY_X86_FEATURE_2_NEEDED: + if (datasz != 4) + printf (_("x86 feature needed: "), datasz); + else + { + printf ("x86 feature needed: "); + decode_x86_feature_2 (bitmask); + } + goto next; + + case GNU_PROPERTY_X86_COMPAT_ISA_1_USED: + if (datasz != 4) + printf (_("x86 ISA used: "), + datasz); + else + { + printf ("x86 ISA used: "); + decode_x86_compat_isa (bitmask); + } + goto next; + + case GNU_PROPERTY_X86_COMPAT_ISA_1_NEEDED: + if (datasz != 4) + printf (_("x86 ISA needed: "), + datasz); + else + { + printf ("x86 ISA needed: "); + decode_x86_compat_isa (bitmask); + } goto next; default: