This is the mail archive of the binutils-cvs@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] Add support to readelf for detecting and reporting Solaris specific section types and symbol visibil


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=fd85a6a1f6aa4abe1c908b909fdb659ac574e5c7

commit fd85a6a1f6aa4abe1c908b909fdb659ac574e5c7
Author: Nick Clifton <nickc@redhat.com>
Date:   Wed Apr 13 15:37:55 2016 +0100

    Add support to readelf for detecting and reporting Solaris specific section types and symbol visibility.
    
    	PR target/19983
    	* readelf.c (get_solaris_section_type): New function: Returns the
    	name of Solaris specific section types.
    	(get_solaris_dynamic_type): New function: Return the name of
    	Solaris specific dynamic types.
    	(get_dynamic_type): Use get_solaris_dynamic_type.
    	(get_section_type_name): Use get_solaris_section_type.
    	(get_solaris_symbol_visibility): New function: Returns Solaris
    	specific symbol visibilities.
    	(print_dynamic_symbol): Use get_solaris_symbol_visibility.
    	(process_symbol_table): Likewise.

Diff:
---
 binutils/ChangeLog |  14 ++++++
 binutils/readelf.c | 137 ++++++++++++++++++++++++++++++++++++++++++++++-------
 2 files changed, 134 insertions(+), 17 deletions(-)

diff --git a/binutils/ChangeLog b/binutils/ChangeLog
index 6f721d9..07b6d13 100644
--- a/binutils/ChangeLog
+++ b/binutils/ChangeLog
@@ -1,3 +1,17 @@
+2016-04-13  Nick Clifton  <nickc@redhat.com>
+
+	PR target/19983
+	* readelf.c (get_solaris_section_type): New function: Returns the
+	name of Solaris specific section types.
+	(get_solaris_dynamic_type): New function: Return the name of
+	Solaris specific dynamic types.
+	(get_dynamic_type): Use get_solaris_dynamic_type.
+	(get_section_type_name): Use get_solaris_section_type.
+	(get_solaris_symbol_visibility): New function: Returns Solaris
+	specific symbol visibilities.
+	(print_dynamic_symbol): Use get_solaris_symbol_visibility.
+	(process_symbol_table): Likewise.
+
 2016-04-13  Andreas Arnez  <arnez@linux.vnet.ibm.com>
 
 	* dwarf.h (init_dwarf_regnames_s390): Declare.
diff --git a/binutils/readelf.c b/binutils/readelf.c
index 9e7fb1e..cf91755 100644
--- a/binutils/readelf.c
+++ b/binutils/readelf.c
@@ -1851,6 +1851,34 @@ get_ia64_dynamic_type (unsigned long type)
 }
 
 static const char *
+get_solaris_section_type (unsigned long type)
+{
+  switch (type)
+    {
+    case 0x6fffffee: return "SUNW_ancillary";
+    case 0x6fffffef: return "SUNW_capchain";
+    case 0x6ffffff0: return "SUNW_capinfo";
+    case 0x6ffffff1: return "SUNW_symsort";
+    case 0x6ffffff2: return "SUNW_tlssort";
+    case 0x6ffffff3: return "SUNW_LDYNSYM";
+    case 0x6ffffff4: return "SUNW_dof";
+    case 0x6ffffff5: return "SUNW_cap";
+    case 0x6ffffff6: return "SUNW_SIGNATURE";
+    case 0x6ffffff7: return "SUNW_ANNOTATE";
+    case 0x6ffffff8: return "SUNW_DEBUGSTR";
+    case 0x6ffffff9: return "SUNW_DEBUG";
+    case 0x6ffffffa: return "SUNW_move";
+    case 0x6ffffffb: return "SUNW_COMDAT";
+    case 0x6ffffffc: return "SUNW_syminfo";
+    case 0x6ffffffd: return "SUNW_verdef";
+    case 0x6ffffffe: return "SUNW_verneed";
+    case 0x6fffffff: return "SUNW_versym";
+    case 0x70000000: return "SPARC_GOTDATA";
+    default: return NULL;
+    }
+}
+
+static const char *
 get_alpha_dynamic_type (unsigned long type)
 {
   switch (type)
@@ -1905,6 +1933,43 @@ get_nios2_dynamic_type (unsigned long type)
 }
 
 static const char *
+get_solaris_dynamic_type (unsigned long type)
+{
+  switch (type)
+    {
+    case 0x6000000d: return "SUNW_AUXILIARY";
+    case 0x6000000e: return "SUNW_RTLDINF";
+    case 0x6000000f: return "SUNW_FILTER";
+    case 0x60000010: return "SUNW_CAP";
+    case 0x60000011: return "SUNW_SYMTAB";
+    case 0x60000012: return "SUNW_SYMSZ";
+    case 0x60000013: return "SUNW_SORTENT";
+    case 0x60000014: return "SUNW_SYMSORT";
+    case 0x60000015: return "SUNW_SYMSORTSZ";
+    case 0x60000016: return "SUNW_TLSSORT";
+    case 0x60000017: return "SUNW_TLSSORTSZ";
+    case 0x60000018: return "SUNW_CAPINFO";
+    case 0x60000019: return "SUNW_STRPAD";
+    case 0x6000001a: return "SUNW_CAPCHAIN";
+    case 0x6000001b: return "SUNW_LDMACH";
+    case 0x6000001d: return "SUNW_CAPCHAINENT";
+    case 0x6000001f: return "SUNW_CAPCHAINSZ";
+    case 0x60000021: return "SUNW_PARENT";
+    case 0x60000023: return "SUNW_ASLR";
+    case 0x60000025: return "SUNW_RELAX";
+    case 0x60000029: return "SUNW_NXHEAP";
+    case 0x6000002b: return "SUNW_NXSTACK";
+
+    case 0x70000001: return "SPARC_REGISTER";
+    case 0x7ffffffd: return "AUXILIARY";
+    case 0x7ffffffe: return "USED";
+    case 0x7fffffff: return "FILTER";
+
+    default: return NULL;      
+    }
+}
+
+static const char *
 get_dynamic_type (unsigned long type)
 {
   static char buff[64];
@@ -2022,7 +2087,10 @@ get_dynamic_type (unsigned long type)
 	      result = get_nios2_dynamic_type (type);
 	      break;
 	    default:
-	      result = NULL;
+	      if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
+		result = get_solaris_dynamic_type (type);
+	      else
+		result = NULL;
 	      break;
 	    }
 
@@ -2046,7 +2114,10 @@ get_dynamic_type (unsigned long type)
 	      result = get_ia64_dynamic_type (type);
 	      break;
 	    default:
-	      result = NULL;
+	      if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
+		result = get_solaris_dynamic_type (type);
+	      else
+		result = NULL;
 	      break;
 	    }
 
@@ -3981,7 +4052,10 @@ get_section_type_name (unsigned int sh_type)
 	      result = get_ia64_section_type_name (sh_type);
 	      break;
 	    default:
-	      result = NULL;
+	      if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
+		result = get_solaris_section_type (sh_type);
+	      else
+		result = NULL;
 	      break;
 	    }
 
@@ -6013,7 +6087,7 @@ process_section_headers (FILE * file)
       printf (_("Key to Flags:\n\
   W (write), A (alloc), X (execute), M (merge), S (strings), I (info),\n\
   L (link order), O (extra OS processing required), G (group), T (TLS),\n\
-  C (compressed), x (unknown), o (OS specific), E (exclude),\n"));
+  C (compressed), x (unknown), o (OS specific), E (exclude),\n  "));
       if (elf_header.e_machine == EM_X86_64
 	  || elf_header.e_machine == EM_L1OM
 	  || elf_header.e_machine == EM_K1OM)
@@ -10209,6 +10283,18 @@ get_symbol_visibility (unsigned int visibility)
 }
 
 static const char *
+get_solaris_symbol_visibility (unsigned int visibility)
+{
+  switch (visibility)
+    {
+    case 4: return "EXPORTED";
+    case 5: return "SINGLETON";
+    case 6: return "ELIMINATE";
+    default: return get_symbol_visibility (visibility);
+    }
+}
+
+static const char *
 get_mips_symbol_other (unsigned int other)
 {
   switch (other)
@@ -10331,6 +10417,7 @@ get_symbol_other (unsigned int other)
       result = get_ppc64_symbol_other (other);
       break;
     default:
+      result = NULL;
       break;
     }
 
@@ -10471,13 +10558,22 @@ print_dynamic_symbol (bfd_vma si, unsigned long hn)
 
   printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
   printf (" %-6s",  get_symbol_binding (ELF_ST_BIND (psym->st_info)));
-  printf (" %-7s",  get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
-  /* Check to see if any other bits in the st_other field are set.
-     Note - displaying this information disrupts the layout of the
-     table being generated, but for the moment this case is very
-     rare.  */
-  if (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other))
-    printf (" [%s] ", get_symbol_other (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other)));
+
+  if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
+    printf (" %-7s",  get_solaris_symbol_visibility (psym->st_other));
+  else
+    {
+      unsigned int vis = ELF_ST_VISIBILITY (psym->st_other);
+
+      printf (" %-7s",  get_symbol_visibility (vis));
+      /* Check to see if any other bits in the st_other field are set.
+	 Note - displaying this information disrupts the layout of the
+	 table being generated, but for the moment this case is very
+	 rare.  */
+      if (psym->st_other ^ vis)
+	printf (" [%s] ", get_symbol_other (psym->st_other ^ vis));
+    }
+
   printf (" %3.3s ", get_symbol_index_type (psym->st_shndx));
   if (VALID_DYNAMIC_NAME (psym->st_name))
     print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
@@ -10956,12 +11052,19 @@ process_symbol_table (FILE * file)
 	      print_vma (psym->st_size, DEC_5);
 	      printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
 	      printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
-	      printf (" %-7s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
-	      /* Check to see if any other bits in the st_other field are set.
-	         Note - displaying this information disrupts the layout of the
-	         table being generated, but for the moment this case is very rare.  */
-	      if (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other))
-		printf (" [%s] ", get_symbol_other (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other)));
+	      if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
+		printf (" %-7s",  get_solaris_symbol_visibility (psym->st_other));
+	      else
+		{
+		  unsigned int vis = ELF_ST_VISIBILITY (psym->st_other);
+
+		  printf (" %-7s", get_symbol_visibility (vis));
+		  /* Check to see if any other bits in the st_other field are set.
+		     Note - displaying this information disrupts the layout of the
+		     table being generated, but for the moment this case is very rare.  */
+		  if (psym->st_other ^ vis)
+		    printf (" [%s] ", get_symbol_other (psym->st_other ^ vis));
+		}
 	      printf (" %4s ", get_symbol_index_type (psym->st_shndx));
 	      print_symbol (25, psym->st_name < strtab_size
 			    ? strtab + psym->st_name : _("<corrupt>"));


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]