From 60abdbedb2b36bcae7abee2747ec027f5f2c9b91 Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Thu, 23 Feb 2017 13:45:21 +0000 Subject: [PATCH] Add support to readelf for displaying gnu attributes in architectures not known to support them. * readelf.c (display_tag_value): Use an explicit signed type for the tag parameter. (display_gnu_attributes): Use an unsigned integer type for attribute tags. (display_power_gnu_attribute): Likewise. (display_s390_gnu_attribute): Likewise. (display_sparc_hwcaps): Likewise. (display_sparc_hwcaps2): Likewise. (display_sparc_gnu_attribute): Likewise. (display_mips_gnu_attribute): Likewise. (display_tic6x_attribute): Likewise. (display_raw_attribute): Likewise. (process_attributes): Likewise. (process_arm_specific): Delete redundant function. (process_power_specific): Likewise. (process_s390_specific): Likewise. (process_sparc_specific): Likewise. (process_tic6x_specific): Likewise. (process_msp430x_specific): Likewise. (display_public_gnu_attributes): New function. Displays known information about an unknown gnu attribute. (display_generic_attribute): New function. Calls display_tag_value for non-nul tags. (process_arch_specific): Call process_attributes even for architectures not known to specifically support gnu attributes. --- binutils/ChangeLog | 28 ++++++++++ binutils/readelf.c | 147 ++++++++++++++++++++++++++--------------------------- 2 files changed, 99 insertions(+), 76 deletions(-) diff --git a/binutils/ChangeLog b/binutils/ChangeLog index 18b9d81..16ceeb1 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,31 @@ +2017-02-23 Nick Clifton + + * readelf.c (display_tag_value): Use an explicit signed type for + the tag parameter. + (display_gnu_attributes): Use an unsigned integer type for + attribute tags. + (display_power_gnu_attribute): Likewise. + (display_s390_gnu_attribute): Likewise. + (display_sparc_hwcaps): Likewise. + (display_sparc_hwcaps2): Likewise. + (display_sparc_gnu_attribute): Likewise. + (display_mips_gnu_attribute): Likewise. + (display_tic6x_attribute): Likewise. + (display_raw_attribute): Likewise. + (process_attributes): Likewise. + (process_arm_specific): Delete redundant function. + (process_power_specific): Likewise. + (process_s390_specific): Likewise. + (process_sparc_specific): Likewise. + (process_tic6x_specific): Likewise. + (process_msp430x_specific): Likewise. + (display_public_gnu_attributes): New function. Displays known + information about an unknown gnu attribute. + (display_generic_attribute): New function. Calls + display_tag_value for non-nul tags. + (process_arch_specific): Call process_attributes even for + architectures not known to specifically support gnu attributes. + 2017-02-22 Jan Kratochvil * dwarf.c (decode_location_expression): Display also OP. diff --git a/binutils/readelf.c b/binutils/readelf.c index da1fa4d..eca066b 100644 --- a/binutils/readelf.c +++ b/binutils/readelf.c @@ -13281,7 +13281,7 @@ process_mips_fpe_exception (int mask) Reads at or beyond END will not be made. */ static unsigned char * -display_tag_value (int tag, +display_tag_value (signed int tag, unsigned char * p, const unsigned char * const end) { @@ -13608,12 +13608,12 @@ display_arm_attribute (unsigned char * p, static unsigned char * display_gnu_attribute (unsigned char * p, - unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int, const unsigned char * const), + unsigned char * (* display_proc_gnu_attribute) (unsigned char *, unsigned int, const unsigned char * const), const unsigned char * const end) { int tag; unsigned int len; - int val; + unsigned int val; tag = read_uleb128 (p, &len, end); p += len; @@ -13658,7 +13658,7 @@ display_gnu_attribute (unsigned char * p, static unsigned char * display_power_gnu_attribute (unsigned char * p, - int tag, + unsigned int tag, const unsigned char * const end) { unsigned int len; @@ -13781,7 +13781,7 @@ display_power_gnu_attribute (unsigned char * p, static unsigned char * display_s390_gnu_attribute (unsigned char * p, - int tag, + unsigned int tag, const unsigned char * const end) { unsigned int len; @@ -13815,7 +13815,7 @@ display_s390_gnu_attribute (unsigned char * p, } static void -display_sparc_hwcaps (int mask) +display_sparc_hwcaps (unsigned int mask) { if (mask) { @@ -13860,7 +13860,7 @@ display_sparc_hwcaps (int mask) } static void -display_sparc_hwcaps2 (int mask) +display_sparc_hwcaps2 (unsigned int mask) { if (mask) { @@ -13896,7 +13896,7 @@ display_sparc_hwcaps2 (int mask) static unsigned char * display_sparc_gnu_attribute (unsigned char * p, - int tag, + unsigned int tag, const unsigned char * const end) { unsigned int len; @@ -13962,7 +13962,7 @@ print_mips_fp_abi_value (int val) static unsigned char * display_mips_gnu_attribute (unsigned char * p, - int tag, + unsigned int tag, const unsigned char * const end) { if (tag == Tag_GNU_MIPS_ABI_FP) @@ -14010,7 +14010,7 @@ static unsigned char * display_tic6x_attribute (unsigned char * p, const unsigned char * const end) { - int tag; + unsigned int tag; unsigned int len; int val; @@ -14255,7 +14255,7 @@ display_tic6x_attribute (unsigned char * p, } static void -display_raw_attribute (unsigned char * p, unsigned char * end) +display_raw_attribute (unsigned char * p, unsigned char const * const end) { unsigned long addr = 0; size_t bytes = end - p; @@ -14304,8 +14304,8 @@ display_msp430x_attribute (unsigned char * p, const unsigned char * const end) { unsigned int len; - int val; - int tag; + unsigned int val; + unsigned int tag; tag = read_uleb128 (p, & len, end); p += len; @@ -14390,7 +14390,7 @@ process_attributes (FILE * file, const char * public_name, unsigned int proc_type, unsigned char * (* display_pub_attribute) (unsigned char *, const unsigned char * const), - unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int, const unsigned char * const)) + unsigned char * (* display_proc_gnu_attribute) (unsigned char *, unsigned int, const unsigned char * const)) { Elf_Internal_Shdr * sect; unsigned i; @@ -14412,7 +14412,11 @@ process_attributes (FILE * file, continue; p = contents; - if (*p == 'A') + /* The first character is the version of the attributes. + Currently only version 1, (aka 'A') is recognised here. */ + if (*p != 'A') + printf (_("Unknown attributes version '%c'(%d) - expecting 'A'\n"), *p, *p); + else { bfd_vma section_len; @@ -14545,7 +14549,7 @@ process_attributes (FILE * file, { while (p < end) p = display_pub_attribute (p, end); - assert (p <= end); + assert (p == end); } else if (gnu_section && display_proc_gnu_attribute != NULL) { @@ -14553,7 +14557,7 @@ process_attributes (FILE * file, p = display_gnu_attribute (p, display_proc_gnu_attribute, end); - assert (p <= end); + assert (p == end); } else if (p < end) { @@ -14566,56 +14570,12 @@ process_attributes (FILE * file, } } } - else - printf (_("Unknown format '%c' (%d)\n"), *p, *p); free (contents); } return 1; } -static int -process_arm_specific (FILE * file) -{ - return process_attributes (file, "aeabi", SHT_ARM_ATTRIBUTES, - display_arm_attribute, NULL); -} - -static int -process_power_specific (FILE * file) -{ - return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL, - display_power_gnu_attribute); -} - -static int -process_s390_specific (FILE * file) -{ - return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL, - display_s390_gnu_attribute); -} - -static int -process_sparc_specific (FILE * file) -{ - return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL, - display_sparc_gnu_attribute); -} - -static int -process_tic6x_specific (FILE * file) -{ - return process_attributes (file, "c6xabi", SHT_C6000_ATTRIBUTES, - display_tic6x_attribute, NULL); -} - -static int -process_msp430x_specific (FILE * file) -{ - return process_attributes (file, "mspabi", SHT_MSP430_ATTRIBUTES, - display_msp430x_attribute, NULL); -} - /* DATA points to the contents of a MIPS GOT that starts at VMA PLTGOT. Print the Address, Access and Initial fields of an entry at VMA ADDR and return the VMA of the next entry, or -1 if there was a problem. @@ -16713,6 +16673,29 @@ process_notes (FILE * file) return 1; } +static unsigned char * +display_public_gnu_attributes (unsigned char * start, + const unsigned char * const end) +{ + printf (_(" Unknown GNU attribute: %s\n"), start); + + start += strnlen ((char *) start, end - start); + display_raw_attribute (start, end); + + return (unsigned char *) end; +} + +static unsigned char * +display_generic_attribute (unsigned char * start, + unsigned int tag, + const unsigned char * const end) +{ + if (tag == 0) + return (unsigned char *) end; + + return display_tag_value (tag, start, end); +} + static int process_arch_specific (FILE * file) { @@ -16722,36 +16705,48 @@ process_arch_specific (FILE * file) switch (elf_header.e_machine) { case EM_ARM: - return process_arm_specific (file); + return process_attributes (file, "aeabi", SHT_ARM_ATTRIBUTES, + display_arm_attribute, + display_generic_attribute); + case EM_MIPS: case EM_MIPS_RS3_LE: return process_mips_specific (file); - break; + + case EM_MSP430: + return process_attributes (file, "mspabi", SHT_MSP430_ATTRIBUTES, + display_msp430x_attribute, + display_generic_attribute); + case EM_NDS32: return process_nds32_specific (file); - break; + case EM_PPC: case EM_PPC64: - return process_power_specific (file); - break; + return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL, + display_power_gnu_attribute); + case EM_S390: case EM_S390_OLD: - return process_s390_specific (file); - break; + return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL, + display_s390_gnu_attribute); + case EM_SPARC: case EM_SPARC32PLUS: case EM_SPARCV9: - return process_sparc_specific (file); - break; + return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL, + display_sparc_gnu_attribute); + case EM_TI_C6000: - return process_tic6x_specific (file); - break; - case EM_MSP430: - return process_msp430x_specific (file); + return process_attributes (file, "c6xabi", SHT_C6000_ATTRIBUTES, + display_tic6x_attribute, + display_generic_attribute); + default: - break; + return process_attributes (file, "gnu", SHT_GNU_ATTRIBUTES, + display_public_gnu_attributes, + display_generic_attribute); } - return 1; } static int -- 2.7.4