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.
This commit is contained in:
Nick Clifton 2016-04-13 15:37:55 +01:00
parent 758c54957d
commit fd85a6a1f6
2 changed files with 134 additions and 17 deletions

View File

@ -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.

View File

@ -1850,6 +1850,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)
{
@ -1904,6 +1932,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)
{
@ -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)
@ -10208,6 +10282,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)
{
@ -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>"));