/* readelf.c -- display contents of an ELF format file
Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
- 2008, 2009 Free Software Foundation, Inc.
+ 2008, 2009, 2010
+ Free Software Foundation, Inc.
Originally developed by Eric Youngdale <eric@andante.jic.com>
Modifications by Nick Clifton <nickc@redhat.com>
static int show_name;
static int do_dynamic;
static int do_syms;
+static int do_dyn_syms;
static int do_reloc;
static int do_sections;
static int do_section_groups;
strcat (buf, ", 64-bit doubles");
if (e_flags & E_FLAG_RX_DSP)
strcat (buf, ", dsp");
+
+ case EM_S390:
+ if (e_flags & EF_S390_HIGH_GPRS)
+ strcat (buf, ", highgprs");
}
}
}
#define OPTION_DEBUG_DUMP 512
+#define OPTION_DYN_SYMS 513
static struct option options[] =
{
{"full-section-name",no_argument, 0, 'N'},
{"symbols", no_argument, 0, 's'},
{"syms", no_argument, 0, 's'},
+ {"dyn-syms", no_argument, 0, OPTION_DYN_SYMS},
{"relocs", no_argument, 0, 'r'},
{"notes", no_argument, 0, 'n'},
{"dynamic", no_argument, 0, 'd'},
-t --section-details Display the section details\n\
-e --headers Equivalent to: -h -l -S\n\
-s --syms Display the symbol table\n\
- --symbols An alias for --syms\n\
+ --symbols An alias for --syms\n\
+ --dyn-syms Display the dynamic symbol table\n\
-n --notes Display the core notes (if present)\n\
-r --relocs Display the relocations (if present)\n\
-u --unwind Display the unwind info (if present)\n\
dwarf_select_sections_by_names (optarg);
}
break;
+ case OPTION_DYN_SYMS:
+ do_dyn_syms++;
+ break;
#ifdef SUPPORT_DISASSEMBLY
case 'i':
request_dump (DISASS_DUMP);
if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
&& !do_segments && !do_header && !do_dump && !do_version
&& !do_histogram && !do_debugging && !do_arch && !do_notes
- && !do_section_groups && !do_archive_index)
+ && !do_section_groups && !do_archive_index
+ && !do_dyn_syms)
usage (stderr);
else if (argc < 3)
{
(long) elf_header.e_ehsize);
printf (_(" Size of program headers: %ld (bytes)\n"),
(long) elf_header.e_phentsize);
- printf (_(" Number of program headers: %ld\n"),
+ printf (_(" Number of program headers: %ld"),
(long) elf_header.e_phnum);
+ if (section_headers != NULL
+ && elf_header.e_phnum == PN_XNUM
+ && section_headers[0].sh_info != 0)
+ printf (_(" (%ld)"), (long) section_headers[0].sh_info);
+ putc ('\n', stdout);
printf (_(" Size of section headers: %ld (bytes)\n"),
(long) elf_header.e_shentsize);
printf (_(" Number of section headers: %ld"),
if (section_headers != NULL)
{
+ if (elf_header.e_phnum == PN_XNUM
+ && section_headers[0].sh_info != 0)
+ elf_header.e_phnum = section_headers[0].sh_info;
if (elf_header.e_shnum == SHN_UNDEF)
elf_header.e_shnum = section_headers[0].sh_size;
if (elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
bfd_vma * gnuchains = NULL;
bfd_vma gnusymidx = 0;
- if (! do_syms && !do_histogram)
+ if (!do_syms && !do_dyn_syms && !do_histogram)
return 1;
if (dynamic_info[DT_HASH]
&& (do_histogram
- || (do_using_dynamic && dynamic_strings != NULL)))
+ || (do_using_dynamic
+ && !do_dyn_syms
+ && dynamic_strings != NULL)))
{
unsigned char nb[8];
unsigned char nc[8];
if (dynamic_info_DT_GNU_HASH
&& (do_histogram
- || (do_using_dynamic && dynamic_strings != NULL)))
+ || (do_using_dynamic
+ && !do_dyn_syms
+ && dynamic_strings != NULL)))
{
unsigned char nb[16];
bfd_vma i, maxchain = 0xffffffff, bitmaskwords;
}
}
}
- else if (do_syms && !do_using_dynamic)
+ else if (do_dyn_syms || (do_syms && !do_using_dynamic))
{
unsigned int i;
Elf_Internal_Sym * symtab;
Elf_Internal_Sym * psym;
- if ( section->sh_type != SHT_SYMTAB
- && section->sh_type != SHT_DYNSYM)
+ if ((section->sh_type != SHT_SYMTAB
+ && section->sh_type != SHT_DYNSYM)
+ || (!do_syms
+ && section->sh_type == SHT_SYMTAB))
continue;
printf (_("\nSymbol table '%s' contains %lu entries:\n"),
static const char * arm_attr_tag_VFP_arch[] =
{"No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16", "VFPv4", "VFPv4-D16"};
static const char * arm_attr_tag_WMMX_arch[] = {"No", "WMMXv1", "WMMXv2"};
-static const char * arm_attr_tag_Advanced_SIMD_arch[] = {"No", "NEONv1"};
+static const char * arm_attr_tag_Advanced_SIMD_arch[] =
+ {"No", "NEONv1", "NEONv1 with Fused-MAC"};
static const char * arm_attr_tag_PCS_config[] =
{"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
"PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
{"Not Allowed", "Allowed"};
static const char * arm_attr_tag_ABI_FP_16bit_format[] =
{"None", "IEEE 754", "Alternative Format"};
+static const char * arm_attr_tag_MPextension_use[] =
+ {"Not Allowed", "Allowed"};
+static const char * arm_attr_tag_DIV_use[] =
+ {"Allowed in Thumb-ISA, v7-R or v7-M", "Not allowed",
+ "Allowed in v7-A with integer division extension"};
static const char * arm_attr_tag_T2EE_use[] = {"Not Allowed", "Allowed"};
static const char * arm_attr_tag_Virtualization_use[] =
+ {"Not Allowed", "TrustZone", "Virtualization Extensions",
+ "TrustZone and Virtualization Extensions"};
+static const char * arm_attr_tag_MPextension_use_legacy[] =
{"Not Allowed", "Allowed"};
-static const char * arm_attr_tag_MPextension_use[] = {"Not Allowed", "Allowed"};
#define LOOKUP(id, name) \
{id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
LOOKUP(34, CPU_unaligned_access),
LOOKUP(36, VFP_HP_extension),
LOOKUP(38, ABI_FP_16bit_format),
+ LOOKUP(42, MPextension_use),
+ LOOKUP(44, DIV_use),
{64, "nodefaults", 0, NULL},
{65, "also_compatible_with", 0, NULL},
LOOKUP(66, T2EE_use),
{67, "conformance", 1, NULL},
LOOKUP(68, Virtualization_use),
- LOOKUP(70, MPextension_use)
+ LOOKUP(70, MPextension_use_legacy)
};
#undef LOOKUP
return _("NT_PPC_VMX (ppc Altivec registers)");
case NT_PPC_VSX:
return _("NT_PPC_VSX (ppc VSX registers)");
+ case NT_X86_XSTATE:
+ return _("NT_X86_XSTATE (x86 XSAVE extended state)");
case NT_S390_HIGH_GPRS:
return _("NT_S390_HIGH_GPRS (s390 upper register halves)");
+ case NT_S390_TIMER:
+ return _("NT_S390_TIMER (s390 timer register)");
+ case NT_S390_TODCMP:
+ return _("NT_S390_TODCMP (s390 TOD comparator register)");
+ case NT_S390_TODPREG:
+ return _("NT_S390_TODPREG (s390 TOD programmable register)");
+ case NT_S390_CTRS:
+ return _("NT_S390_CTRS (s390 control registers)");
+ case NT_S390_PREFIX:
+ return _("NT_S390_PREFIX (s390 prefix register)");
case NT_PSTATUS:
return _("NT_PSTATUS (pstatus structure)");
case NT_FPREGS:
do_unwind = do_version = do_dump = do_arch = 0;
if (! do_using_dynamic)
- do_syms = do_reloc = 0;
+ do_syms = do_dyn_syms = do_reloc = 0;
}
if (! process_section_groups (file))
if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
&& !do_segments && !do_header && !do_dump && !do_version
&& !do_histogram && !do_debugging && !do_arch && !do_notes
- && !do_section_groups)
+ && !do_section_groups && !do_dyn_syms)
{
ret = 0; /* Archive index only. */
goto out;