\f
#include <assert.h>
+#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <time.h>
#include "elf/mcore.h"
#include "elf/i960.h"
#include "elf/pj.h"
+#include "elf/avr.h"
+#include "elf/ia64.h"
#include "bucomm.h"
#include "getopt.h"
-#ifdef ANSI_PROTOTYPES
-#include <stdarg.h>
-#else
-#include <varargs.h>
-#endif
-
char * program_name = "readelf";
unsigned int dynamic_addr;
bfd_size_type dynamic_size;
static int dump_relocations PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Sym *, unsigned long, char *, int));
static char * get_file_type PARAMS ((unsigned));
static char * get_machine_name PARAMS ((unsigned));
+static void decode_ARM_machine_flags PARAMS ((unsigned, char []));
static char * get_machine_flags PARAMS ((unsigned, unsigned));
static const char * get_mips_segment_type PARAMS ((unsigned long));
static const char * get_parisc_segment_type PARAMS ((unsigned long));
static void free_abbrevs PARAMS ((void));
static void add_abbrev PARAMS ((unsigned long, unsigned long, int));
static void add_abbrev_attr PARAMS ((unsigned long, unsigned long));
-static unsigned char * read_and_display_attr PARAMS ((unsigned long, unsigned long, unsigned char *, unsigned long));
+static unsigned char * read_and_display_attr PARAMS ((unsigned long, unsigned long, unsigned char *, unsigned long, unsigned long));
static unsigned char * display_block PARAMS ((unsigned char *, unsigned long));
-static void decode_location_expression PARAMS ((unsigned char *, unsigned int));
+static void decode_location_expression PARAMS ((unsigned char *, unsigned int, unsigned long));
static void request_dump PARAMS ((unsigned int, char));
static const char * get_elf_class PARAMS ((unsigned char));
static const char * get_data_encoding PARAMS ((unsigned char));
case EM_SH:
case EM_ALPHA:
case EM_MCORE:
+ case EM_IA_64:
+ case EM_AVR:
return TRUE;
case EM_MMA:
rtype = elf_i960_reloc_type (type);
break;
+ case EM_AVR:
+ rtype = elf_avr_reloc_type (type);
+ break;
+
case EM_OLD_SPARCV9:
case EM_SPARC32PLUS:
case EM_SPARCV9:
case EM_PJ:
rtype = elf_pj_reloc_type (type);
break;
+ case EM_IA_64:
+ rtype = elf_ia64_reloc_type (type);
+ break;
}
if (rtype == NULL)
case EM_SVX: return "Silicon Graphics SVx";
case EM_ST19: return "STMicroelectronics ST19 8-bit microcontroller";
case EM_VAX: return "Digital VAX";
+ case EM_AVR: return "Atmel AVR 8-bit microcontroller";
default:
sprintf (buff, _("<unknown>: %x"), e_machine);
return buff;
}
}
+static void
+decode_ARM_machine_flags (e_flags, buf)
+ unsigned e_flags;
+ char buf[];
+{
+ unsigned eabi;
+ int unknown = 0;
+
+ eabi = EF_ARM_EABI_VERSION (e_flags);
+ e_flags &= ~ EF_ARM_EABIMASK;
+
+ /* Handle "generic" ARM flags. */
+ if (e_flags & EF_ARM_RELEXEC)
+ {
+ strcat (buf, ", relocatable executable");
+ e_flags &= ~ EF_ARM_RELEXEC;
+ }
+
+ if (e_flags & EF_ARM_HASENTRY)
+ {
+ strcat (buf, ", has entry point");
+ e_flags &= ~ EF_ARM_HASENTRY;
+ }
+
+ /* Now handle EABI specific flags. */
+ switch (eabi)
+ {
+ default:
+ strcat (buf, ", <unknown EABI>");
+ if (e_flags)
+ unknown = 1;
+ break;
+
+ case EF_ARM_EABI_VER1:
+ while (e_flags)
+ {
+ unsigned flag;
+
+ /* Process flags one bit at a time. */
+ flag = e_flags & - e_flags;
+ e_flags &= ~ flag;
+
+ switch (flag)
+ {
+ case EF_ARM_SYMSARESORTED: /* Conflicts with EF_INTERWORK. */
+ strcat (buf, ", sorted symbol tables");
+ break;
+
+ default:
+ unknown = 1;
+ break;
+ }
+ }
+ break;
+
+ case EF_ARM_EABI_UNKNOWN:
+ while (e_flags)
+ {
+ unsigned flag;
+
+ /* Process flags one bit at a time. */
+ flag = e_flags & - e_flags;
+ e_flags &= ~ flag;
+
+ switch (flag)
+ {
+ case EF_INTERWORK:
+ strcat (buf, ", interworking enabled");
+ break;
+
+ case EF_APCS_26:
+ strcat (buf, ", uses APCS/26");
+ break;
+
+ case EF_APCS_FLOAT:
+ strcat (buf, ", uses APCS/float");
+ break;
+
+ case EF_PIC:
+ strcat (buf, ", position independent");
+ break;
+
+ case EF_ALIGN8:
+ strcat (buf, ", 8 bit structure alignment");
+ break;
+
+ case EF_NEW_ABI:
+ strcat (buf, ", uses new ABI");
+ break;
+
+ case EF_OLD_ABI:
+ strcat (buf, ", uses old ABI");
+ break;
+
+ case EF_SOFT_FLOAT:
+ strcat (buf, ", software FP");
+ break;
+
+ default:
+ unknown = 1;
+ break;
+ }
+ }
+ }
+
+ if (unknown)
+ strcat (buf,", <unknown>");
+}
+
static char *
get_machine_flags (e_flags, e_machine)
unsigned e_flags;
default:
break;
+ case EM_ARM:
+ decode_ARM_machine_flags (e_flags, buf);
+ break;
+
case EM_68K:
if (e_flags & EF_CPU32)
strcat (buf, ", cpu32");
fprintf (stdout, _(" -I or --histogram Display histogram of bucket list lengths\n"));
fprintf (stdout, _(" -v or --version Display the version number of readelf\n"));
fprintf (stdout, _(" -H or --help Display this information\n"));
- fprintf (stdout, _("Report bugs to bug-gnu-utils@gnu.org\n"));
+ fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
exit (0);
}
switch (osabi)
{
- case ELFOSABI_SYSV: return _("UNIX - System V");
+ case ELFOSABI_NONE: return _("UNIX - System V");
case ELFOSABI_HPUX: return _("UNIX - HP-UX");
+ case ELFOSABI_NETBSD: return _("UNIX - NetBSD");
case ELFOSABI_LINUX: return _("UNIX - Linux");
+ case ELFOSABI_HURD: return _("GNU/Hurd");
+ case ELFOSABI_SOLARIS: return _("UNIX - Solaris");
+ case ELFOSABI_MONTEREY: return _("UNIX - Monterey");
+ case ELFOSABI_IRIX: return _("UNIX - IRIX");
+ case ELFOSABI_FREEBSD: return _("UNIX - FreeBSD");
+ case ELFOSABI_TRU64: return _("UNIX - TRU64");
+ case ELFOSABI_MODESTO: return _("Novell - Modesto");
+ case ELFOSABI_OPENBSD: return _("UNIX - OpenBSD");
case ELFOSABI_STANDALONE: return _("Standalone App");
case ELFOSABI_ARM: return _("ARM");
default:
case DT_MIPS_TIME_STAMP:
{
char timebuf[20];
+ struct tm * tmp;
+
time_t time = entry->d_un.d_val;
- strftime (timebuf, 20, "%Y-%m-%dT%H:%M:%S", gmtime (&time));
+ tmp = gmtime (&time);
+ sprintf (timebuf, "%04u-%02u-%02uT%02u:%02u:%02u",
+ tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
+ tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
printf ("Time Stamp: %s\n", timebuf);
}
break;
{
if (do_dynamic)
{
- const char *dtype;
+ const char * dtype;
putchar (' ');
print_vma (entry->d_tag, FULL_HEX);
for (cnt = 0; cnt < total; cnt += 4)
{
int j, nn;
- char *name;
+ char * name;
printf (" %03x:", cnt);
{
Elf_External_Verneed evn;
Elf_External_Vernaux evna;
- Elf_Internal_Vernaux ivna;
- unsigned long vna_off;
+ Elf_Internal_Vernaux ivna;
+ unsigned long vna_off;
GET_DATA (offset, evn, "version need");
do
{
- Elf_Internal_Vernaux ivna;
+ Elf_Internal_Vernaux ivna;
Elf_External_Verneed evn;
Elf_External_Vernaux evna;
- unsigned long a_off;
+ unsigned long a_off;
GET_DATA (offset, evn, "version need");
offset = version_info
[DT_VERSIONTAGIDX (DT_VERNEED)] - loadaddr;
- GET_DATA (offset, evn, "version need");
-
- ivn.vn_aux = BYTE_GET (evn.vn_aux);
- ivn.vn_next = BYTE_GET (evn.vn_next);
-
do
{
unsigned long vna_off;
+ GET_DATA (offset, evn, "version need");
+
+ ivn.vn_aux = BYTE_GET (evn.vn_aux);
+ ivn.vn_next = BYTE_GET (evn.vn_next);
+
vna_off = offset + ivn.vn_aux;
do
}
static void
-decode_location_expression (data, pointer_size)
+decode_location_expression (data, pointer_size, length)
unsigned char * data;
unsigned int pointer_size;
+ unsigned long length;
{
- unsigned char op;
+ unsigned op;
int bytes_read;
unsigned long uvalue;
+ unsigned char *end = data + length;
- op = * data ++;
-
- switch (op)
+ while (data < end)
{
- case DW_OP_addr:
- printf ("DW_OP_addr: %lx", (unsigned long) byte_get (data, pointer_size));
- break;
- case DW_OP_deref:
- printf ("DW_OP_deref");
- break;
- case DW_OP_const1u:
- printf ("DW_OP_const1u: %lu", (unsigned long) byte_get (data, 1));
- break;
- case DW_OP_const1s:
- printf ("DW_OP_const1s: %ld", (long) byte_get (data, 1));
- break;
- case DW_OP_const2u:
- printf ("DW_OP_const2u: %lu", (unsigned long) byte_get (data, 2));
- break;
- case DW_OP_const2s:
- printf ("DW_OP_const2s: %ld", (long) byte_get (data, 2));
- break;
- case DW_OP_const4u:
- printf ("DW_OP_const4u: %lu", (unsigned long) byte_get (data, 4));
- break;
- case DW_OP_const4s:
- printf ("DW_OP_const4s: %ld", (long) byte_get (data, 4));
- break;
- case DW_OP_const8u:
- printf ("DW_OP_const8u: %lu %lu", (unsigned long) byte_get (data, 4),
- (unsigned long) byte_get (data + 4, 4));
- break;
- case DW_OP_const8s:
- printf ("DW_OP_const8s: %ld %ld", (long) byte_get (data, 4),
- (long) byte_get (data + 4, 4));
- break;
- case DW_OP_constu:
- printf ("DW_OP_constu: %lu", read_leb128 (data, NULL, 0));
- break;
- case DW_OP_consts:
- printf ("DW_OP_consts: %ld", read_leb128 (data, NULL, 1));
- break;
- case DW_OP_dup:
- printf ("DW_OP_dup");
- break;
- case DW_OP_drop:
- printf ("DW_OP_drop");
- break;
- case DW_OP_over:
- printf ("DW_OP_over");
- break;
- case DW_OP_pick:
- printf ("DW_OP_pick: %ld", (unsigned long) byte_get (data, 1));
- break;
- case DW_OP_swap:
- printf ("DW_OP_swap");
- break;
- case DW_OP_rot:
- printf ("DW_OP_rot");
- break;
- case DW_OP_xderef:
- printf ("DW_OP_xderef");
- break;
- case DW_OP_abs:
- printf ("DW_OP_abs");
- break;
- case DW_OP_and:
- printf ("DW_OP_and");
- break;
- case DW_OP_div:
- printf ("DW_OP_div");
- break;
- case DW_OP_minus:
- printf ("DW_OP_minus");
- break;
- case DW_OP_mod:
- printf ("DW_OP_mod");
- break;
- case DW_OP_mul:
- printf ("DW_OP_mul");
- break;
- case DW_OP_neg:
- printf ("DW_OP_neg");
- break;
- case DW_OP_not:
- printf ("DW_OP_not");
- break;
- case DW_OP_or:
- printf ("DW_OP_or");
- break;
- case DW_OP_plus:
- printf ("DW_OP_plus");
- break;
- case DW_OP_plus_uconst:
- printf ("DW_OP_plus_uconst: %lu", read_leb128 (data, NULL, 0));
- break;
- case DW_OP_shl:
- printf ("DW_OP_shl");
- break;
- case DW_OP_shr:
- printf ("DW_OP_shr");
- break;
- case DW_OP_shra:
- printf ("DW_OP_shra");
- break;
- case DW_OP_xor:
- printf ("DW_OP_xor");
- break;
- case DW_OP_bra:
- printf ("DW_OP_bra: %ld", (long) byte_get (data, 2));
- break;
- case DW_OP_eq:
- printf ("DW_OP_eq");
- break;
- case DW_OP_ge:
- printf ("DW_OP_ge");
- break;
- case DW_OP_gt:
- printf ("DW_OP_gt");
- break;
- case DW_OP_le:
- printf ("DW_OP_le");
- break;
- case DW_OP_lt:
- printf ("DW_OP_lt");
- break;
- case DW_OP_ne:
- printf ("DW_OP_ne");
- break;
- case DW_OP_skip:
- printf ("DW_OP_skip: %ld", (long) byte_get (data, 2));
- break;
- case DW_OP_lit0:
- printf ("DW_OP_lit0");
- break;
- case DW_OP_lit1:
- printf ("DW_OP_lit1");
- break;
- case DW_OP_lit2:
- printf ("DW_OP_lit2");
- break;
- case DW_OP_lit3:
- printf ("DW_OP_lit3");
- break;
- case DW_OP_lit4:
- printf ("DW_OP_lit4");
- break;
- case DW_OP_lit5:
- printf ("DW_OP_lit5");
- break;
- case DW_OP_lit6:
- printf ("DW_OP_lit6");
- break;
- case DW_OP_lit7:
- printf ("DW_OP_lit7");
- break;
- case DW_OP_lit8:
- printf ("DW_OP_lit8");
- break;
- case DW_OP_lit9:
- printf ("DW_OP_lit9");
- break;
- case DW_OP_lit10:
- printf ("DW_OP_lit10");
- break;
- case DW_OP_lit11:
- printf ("DW_OP_lit11");
- break;
- case DW_OP_lit12:
- printf ("DW_OP_lit12");
- break;
- case DW_OP_lit13:
- printf ("DW_OP_lit13");
- break;
- case DW_OP_lit14:
- printf ("DW_OP_lit14");
- break;
- case DW_OP_lit15:
- printf ("DW_OP_lit15");
- break;
- case DW_OP_lit16:
- printf ("DW_OP_lit16");
- break;
- case DW_OP_lit17:
- printf ("DW_OP_lit17");
- break;
- case DW_OP_lit18:
- printf ("DW_OP_lit18");
- break;
- case DW_OP_lit19:
- printf ("DW_OP_lit19");
- break;
- case DW_OP_lit20:
- printf ("DW_OP_lit20");
- break;
- case DW_OP_lit21:
- printf ("DW_OP_lit21");
- break;
- case DW_OP_lit22:
- printf ("DW_OP_lit22");
- break;
- case DW_OP_lit23:
- printf ("DW_OP_lit23");
- break;
- case DW_OP_lit24:
- printf ("DW_OP_lit24");
- break;
- case DW_OP_lit25:
- printf ("DW_OP_lit25");
- break;
- case DW_OP_lit26:
- printf ("DW_OP_lit26");
- break;
- case DW_OP_lit27:
- printf ("DW_OP_lit27");
- break;
- case DW_OP_lit28:
- printf ("DW_OP_lit28");
- break;
- case DW_OP_lit29:
- printf ("DW_OP_lit29");
- break;
- case DW_OP_lit30:
- printf ("DW_OP_lit30");
- break;
- case DW_OP_lit31:
- printf ("DW_OP_lit31");
- break;
- case DW_OP_reg0:
- printf ("DW_OP_reg0");
- break;
- case DW_OP_reg1:
- printf ("DW_OP_reg1");
- break;
- case DW_OP_reg2:
- printf ("DW_OP_reg2");
- break;
- case DW_OP_reg3:
- printf ("DW_OP_reg3");
- break;
- case DW_OP_reg4:
- printf ("DW_OP_reg4");
- break;
- case DW_OP_reg5:
- printf ("DW_OP_reg5");
- break;
- case DW_OP_reg6:
- printf ("DW_OP_reg6");
- break;
- case DW_OP_reg7:
- printf ("DW_OP_reg7");
- break;
- case DW_OP_reg8:
- printf ("DW_OP_reg8");
- break;
- case DW_OP_reg9:
- printf ("DW_OP_reg9");
- break;
- case DW_OP_reg10:
- printf ("DW_OP_reg10");
- break;
- case DW_OP_reg11:
- printf ("DW_OP_reg11");
- break;
- case DW_OP_reg12:
- printf ("DW_OP_reg12");
- break;
- case DW_OP_reg13:
- printf ("DW_OP_reg13");
- break;
- case DW_OP_reg14:
- printf ("DW_OP_reg14");
- break;
- case DW_OP_reg15:
- printf ("DW_OP_reg15");
- break;
- case DW_OP_reg16:
- printf ("DW_OP_reg16");
- break;
- case DW_OP_reg17:
- printf ("DW_OP_reg17");
- break;
- case DW_OP_reg18:
- printf ("DW_OP_reg18");
- break;
- case DW_OP_reg19:
- printf ("DW_OP_reg19");
- break;
- case DW_OP_reg20:
- printf ("DW_OP_reg20");
- break;
- case DW_OP_reg21:
- printf ("DW_OP_reg21");
- break;
- case DW_OP_reg22:
- printf ("DW_OP_reg22");
- break;
- case DW_OP_reg23:
- printf ("DW_OP_reg23");
- break;
- case DW_OP_reg24:
- printf ("DW_OP_reg24");
- break;
- case DW_OP_reg25:
- printf ("DW_OP_reg25");
- break;
- case DW_OP_reg26:
- printf ("DW_OP_reg26");
- break;
- case DW_OP_reg27:
- printf ("DW_OP_reg27");
- break;
- case DW_OP_reg28:
- printf ("DW_OP_reg28");
- break;
- case DW_OP_reg29:
- printf ("DW_OP_reg29");
- break;
- case DW_OP_reg30:
- printf ("DW_OP_reg30");
- break;
- case DW_OP_reg31:
- printf ("DW_OP_reg31");
- break;
- case DW_OP_breg0:
- printf ("DW_OP_breg0: %ld", read_leb128 (data, NULL, 1));
- break;
- case DW_OP_breg1:
- printf ("DW_OP_breg1: %ld", read_leb128 (data, NULL, 1));
- break;
- case DW_OP_breg2:
- printf ("DW_OP_breg2: %ld", read_leb128 (data, NULL, 1));
- break;
- case DW_OP_breg3:
- printf ("DW_OP_breg3: %ld", read_leb128 (data, NULL, 1));
- break;
- case DW_OP_breg4:
- printf ("DW_OP_breg4: %ld", read_leb128 (data, NULL, 1));
- break;
- case DW_OP_breg5:
- printf ("DW_OP_breg5: %ld", read_leb128 (data, NULL, 1));
- break;
- case DW_OP_breg6:
- printf ("DW_OP_breg6: %ld", read_leb128 (data, NULL, 1));
- break;
- case DW_OP_breg7:
- printf ("DW_OP_breg7: %ld", read_leb128 (data, NULL, 1));
- break;
- case DW_OP_breg8:
- printf ("DW_OP_breg8: %ld", read_leb128 (data, NULL, 1));
- break;
- case DW_OP_breg9:
- printf ("DW_OP_breg9: %ld", read_leb128 (data, NULL, 1));
- break;
- case DW_OP_breg10:
- printf ("DW_OP_breg10: %ld", read_leb128 (data, NULL, 1));
- break;
- case DW_OP_breg11:
- printf ("DW_OP_breg11: %ld", read_leb128 (data, NULL, 1));
- break;
- case DW_OP_breg12:
- printf ("DW_OP_breg12: %ld", read_leb128 (data, NULL, 1));
- break;
- case DW_OP_breg13:
- printf ("DW_OP_breg13: %ld", read_leb128 (data, NULL, 1));
- break;
- case DW_OP_breg14:
- printf ("DW_OP_breg14: %ld", read_leb128 (data, NULL, 1));
- break;
- case DW_OP_breg15:
- printf ("DW_OP_breg15: %ld", read_leb128 (data, NULL, 1));
- break;
- case DW_OP_breg16:
- printf ("DW_OP_breg16: %ld", read_leb128 (data, NULL, 1));
- break;
- case DW_OP_breg17:
- printf ("DW_OP_breg17: %ld", read_leb128 (data, NULL, 1));
- break;
- case DW_OP_breg18:
- printf ("DW_OP_breg18: %ld", read_leb128 (data, NULL, 1));
- break;
- case DW_OP_breg19:
- printf ("DW_OP_breg19: %ld", read_leb128 (data, NULL, 1));
- break;
- case DW_OP_breg20:
- printf ("DW_OP_breg20: %ld", read_leb128 (data, NULL, 1));
- break;
- case DW_OP_breg21:
- printf ("DW_OP_breg21: %ld", read_leb128 (data, NULL, 1));
- break;
- case DW_OP_breg22:
- printf ("DW_OP_breg22: %ld", read_leb128 (data, NULL, 1));
- break;
- case DW_OP_breg23:
- printf ("DW_OP_breg23: %ld", read_leb128 (data, NULL, 1));
- break;
- case DW_OP_breg24:
- printf ("DW_OP_breg24: %ld", read_leb128 (data, NULL, 1));
- break;
- case DW_OP_breg25:
- printf ("DW_OP_breg25: %ld", read_leb128 (data, NULL, 1));
- break;
- case DW_OP_breg26:
- printf ("DW_OP_breg26: %ld", read_leb128 (data, NULL, 1));
- break;
- case DW_OP_breg27:
- printf ("DW_OP_breg27: %ld", read_leb128 (data, NULL, 1));
- break;
- case DW_OP_breg28:
- printf ("DW_OP_breg28: %ld", read_leb128 (data, NULL, 1));
- break;
- case DW_OP_breg29:
- printf ("DW_OP_breg29: %ld", read_leb128 (data, NULL, 1));
- break;
- case DW_OP_breg30:
- printf ("DW_OP_breg30: %ld", read_leb128 (data, NULL, 1));
- break;
- case DW_OP_breg31:
- printf ("DW_OP_breg31: %ld", read_leb128 (data, NULL, 1));
- break;
- case DW_OP_regx:
- printf ("DW_OP_regx: %lu", read_leb128 (data, NULL, 0));
- break;
- case DW_OP_fbreg:
- printf ("DW_OP_fbreg: %ld", read_leb128 (data, NULL, 1));
- break;
- case DW_OP_bregx:
- uvalue = read_leb128 (data, &bytes_read, 0);
- printf ("DW_OP_bregx: %lu %ld", uvalue,
- read_leb128 (data + bytes_read, NULL, 1));
- break;
- case DW_OP_piece:
- printf ("DW_OP_piece: %lu", read_leb128 (data, NULL, 0));
- break;
- case DW_OP_deref_size:
- printf ("DW_OP_deref_size: %ld", (long) byte_get (data, 1));
- break;
- case DW_OP_xderef_size:
- printf ("DW_OP_xderef_size: %ld", (long) byte_get (data, 1));
- break;
- case DW_OP_nop:
- printf ("DW_OP_nop");
- break;
+ op = * data ++;
- default:
- if (op >= DW_OP_lo_user
- && op <= DW_OP_hi_user)
- printf (_("(User defined location op)"));
- else
- printf (_("(Unknown location op)"));
- break;
+ switch (op)
+ {
+ case DW_OP_addr:
+ printf ("DW_OP_addr: %lx",
+ (unsigned long) byte_get (data, pointer_size));
+ data += pointer_size;
+ break;
+ case DW_OP_deref:
+ printf ("DW_OP_deref");
+ break;
+ case DW_OP_const1u:
+ printf ("DW_OP_const1u: %lu", (unsigned long) byte_get (data++, 1));
+ break;
+ case DW_OP_const1s:
+ printf ("DW_OP_const1s: %ld", (long) byte_get (data++, 1));
+ break;
+ case DW_OP_const2u:
+ printf ("DW_OP_const2u: %lu", (unsigned long) byte_get (data, 2));
+ data += 2;
+ break;
+ case DW_OP_const2s:
+ printf ("DW_OP_const2s: %ld", (long) byte_get (data, 2));
+ data += 2;
+ break;
+ case DW_OP_const4u:
+ printf ("DW_OP_const4u: %lu", (unsigned long) byte_get (data, 4));
+ data += 4;
+ break;
+ case DW_OP_const4s:
+ printf ("DW_OP_const4s: %ld", (long) byte_get (data, 4));
+ data += 4;
+ break;
+ case DW_OP_const8u:
+ printf ("DW_OP_const8u: %lu %lu", (unsigned long) byte_get (data, 4),
+ (unsigned long) byte_get (data + 4, 4));
+ data += 8;
+ break;
+ case DW_OP_const8s:
+ printf ("DW_OP_const8s: %ld %ld", (long) byte_get (data, 4),
+ (long) byte_get (data + 4, 4));
+ data += 8;
+ break;
+ case DW_OP_constu:
+ printf ("DW_OP_constu: %lu", read_leb128 (data, &bytes_read, 0));
+ data += bytes_read;
+ break;
+ case DW_OP_consts:
+ printf ("DW_OP_consts: %ld", read_leb128 (data, &bytes_read, 1));
+ data += bytes_read;
+ break;
+ case DW_OP_dup:
+ printf ("DW_OP_dup");
+ break;
+ case DW_OP_drop:
+ printf ("DW_OP_drop");
+ break;
+ case DW_OP_over:
+ printf ("DW_OP_over");
+ break;
+ case DW_OP_pick:
+ printf ("DW_OP_pick: %ld", (unsigned long) byte_get (data++, 1));
+ break;
+ case DW_OP_swap:
+ printf ("DW_OP_swap");
+ break;
+ case DW_OP_rot:
+ printf ("DW_OP_rot");
+ break;
+ case DW_OP_xderef:
+ printf ("DW_OP_xderef");
+ break;
+ case DW_OP_abs:
+ printf ("DW_OP_abs");
+ break;
+ case DW_OP_and:
+ printf ("DW_OP_and");
+ break;
+ case DW_OP_div:
+ printf ("DW_OP_div");
+ break;
+ case DW_OP_minus:
+ printf ("DW_OP_minus");
+ break;
+ case DW_OP_mod:
+ printf ("DW_OP_mod");
+ break;
+ case DW_OP_mul:
+ printf ("DW_OP_mul");
+ break;
+ case DW_OP_neg:
+ printf ("DW_OP_neg");
+ break;
+ case DW_OP_not:
+ printf ("DW_OP_not");
+ break;
+ case DW_OP_or:
+ printf ("DW_OP_or");
+ break;
+ case DW_OP_plus:
+ printf ("DW_OP_plus");
+ break;
+ case DW_OP_plus_uconst:
+ printf ("DW_OP_plus_uconst: %lu",
+ read_leb128 (data, &bytes_read, 0));
+ data += bytes_read;
+ break;
+ case DW_OP_shl:
+ printf ("DW_OP_shl");
+ break;
+ case DW_OP_shr:
+ printf ("DW_OP_shr");
+ break;
+ case DW_OP_shra:
+ printf ("DW_OP_shra");
+ break;
+ case DW_OP_xor:
+ printf ("DW_OP_xor");
+ break;
+ case DW_OP_bra:
+ printf ("DW_OP_bra: %ld", (long) byte_get (data, 2));
+ data += 2;
+ break;
+ case DW_OP_eq:
+ printf ("DW_OP_eq");
+ break;
+ case DW_OP_ge:
+ printf ("DW_OP_ge");
+ break;
+ case DW_OP_gt:
+ printf ("DW_OP_gt");
+ break;
+ case DW_OP_le:
+ printf ("DW_OP_le");
+ break;
+ case DW_OP_lt:
+ printf ("DW_OP_lt");
+ break;
+ case DW_OP_ne:
+ printf ("DW_OP_ne");
+ break;
+ case DW_OP_skip:
+ printf ("DW_OP_skip: %ld", (long) byte_get (data, 2));
+ data += 2;
+ break;
+
+ case DW_OP_lit0:
+ case DW_OP_lit1:
+ case DW_OP_lit2:
+ case DW_OP_lit3:
+ case DW_OP_lit4:
+ case DW_OP_lit5:
+ case DW_OP_lit6:
+ case DW_OP_lit7:
+ case DW_OP_lit8:
+ case DW_OP_lit9:
+ case DW_OP_lit10:
+ case DW_OP_lit11:
+ case DW_OP_lit12:
+ case DW_OP_lit13:
+ case DW_OP_lit14:
+ case DW_OP_lit15:
+ case DW_OP_lit16:
+ case DW_OP_lit17:
+ case DW_OP_lit18:
+ case DW_OP_lit19:
+ case DW_OP_lit20:
+ case DW_OP_lit21:
+ case DW_OP_lit22:
+ case DW_OP_lit23:
+ case DW_OP_lit24:
+ case DW_OP_lit25:
+ case DW_OP_lit26:
+ case DW_OP_lit27:
+ case DW_OP_lit28:
+ case DW_OP_lit29:
+ case DW_OP_lit30:
+ case DW_OP_lit31:
+ printf ("DW_OP_lit%d", op - DW_OP_lit0);
+ break;
+
+ case DW_OP_reg0:
+ case DW_OP_reg1:
+ case DW_OP_reg2:
+ case DW_OP_reg3:
+ case DW_OP_reg4:
+ case DW_OP_reg5:
+ case DW_OP_reg6:
+ case DW_OP_reg7:
+ case DW_OP_reg8:
+ case DW_OP_reg9:
+ case DW_OP_reg10:
+ case DW_OP_reg11:
+ case DW_OP_reg12:
+ case DW_OP_reg13:
+ case DW_OP_reg14:
+ case DW_OP_reg15:
+ case DW_OP_reg16:
+ case DW_OP_reg17:
+ case DW_OP_reg18:
+ case DW_OP_reg19:
+ case DW_OP_reg20:
+ case DW_OP_reg21:
+ case DW_OP_reg22:
+ case DW_OP_reg23:
+ case DW_OP_reg24:
+ case DW_OP_reg25:
+ case DW_OP_reg26:
+ case DW_OP_reg27:
+ case DW_OP_reg28:
+ case DW_OP_reg29:
+ case DW_OP_reg30:
+ case DW_OP_reg31:
+ printf ("DW_OP_reg%d", op - DW_OP_reg0);
+ break;
+
+ case DW_OP_breg0:
+ case DW_OP_breg1:
+ case DW_OP_breg2:
+ case DW_OP_breg3:
+ case DW_OP_breg4:
+ case DW_OP_breg5:
+ case DW_OP_breg6:
+ case DW_OP_breg7:
+ case DW_OP_breg8:
+ case DW_OP_breg9:
+ case DW_OP_breg10:
+ case DW_OP_breg11:
+ case DW_OP_breg12:
+ case DW_OP_breg13:
+ case DW_OP_breg14:
+ case DW_OP_breg15:
+ case DW_OP_breg16:
+ case DW_OP_breg17:
+ case DW_OP_breg18:
+ case DW_OP_breg19:
+ case DW_OP_breg20:
+ case DW_OP_breg21:
+ case DW_OP_breg22:
+ case DW_OP_breg23:
+ case DW_OP_breg24:
+ case DW_OP_breg25:
+ case DW_OP_breg26:
+ case DW_OP_breg27:
+ case DW_OP_breg28:
+ case DW_OP_breg29:
+ case DW_OP_breg30:
+ case DW_OP_breg31:
+ printf ("DW_OP_breg%d: %ld", op - DW_OP_breg0,
+ read_leb128 (data, &bytes_read, 1));
+ data += bytes_read;
+ break;
+
+ case DW_OP_regx:
+ printf ("DW_OP_regx: %lu", read_leb128 (data, &bytes_read, 0));
+ data += bytes_read;
+ break;
+ case DW_OP_fbreg:
+ printf ("DW_OP_fbreg: %ld", read_leb128 (data, &bytes_read, 1));
+ data += bytes_read;
+ break;
+ case DW_OP_bregx:
+ uvalue = read_leb128 (data, &bytes_read, 0);
+ data += bytes_read;
+ printf ("DW_OP_bregx: %lu %ld", uvalue,
+ read_leb128 (data, &bytes_read, 1));
+ data += bytes_read;
+ break;
+ case DW_OP_piece:
+ printf ("DW_OP_piece: %lu", read_leb128 (data, &bytes_read, 0));
+ data += bytes_read;
+ break;
+ case DW_OP_deref_size:
+ printf ("DW_OP_deref_size: %ld", (long) byte_get (data++, 1));
+ break;
+ case DW_OP_xderef_size:
+ printf ("DW_OP_xderef_size: %ld", (long) byte_get (data++, 1));
+ break;
+ case DW_OP_nop:
+ printf ("DW_OP_nop");
+ break;
+
+ default:
+ if (op >= DW_OP_lo_user
+ && op <= DW_OP_hi_user)
+ printf (_("(User defined location op)"));
+ else
+ printf (_("(Unknown location op)"));
+ /* No way to tell where the next op is, so just bail. */
+ return;
+ }
}
}
static unsigned char *
-read_and_display_attr (attribute, form, data, pointer_size)
+read_and_display_attr (attribute, form, data, cu_offset, pointer_size)
unsigned long attribute;
unsigned long form;
unsigned char * data;
+ unsigned long cu_offset;
unsigned long pointer_size;
{
unsigned long uvalue = 0;
unsigned char * block_start = NULL;
int bytes_read;
- int is_ref = 0;
printf (" %-18s:", get_AT_name (attribute));
switch (form)
{
case DW_FORM_ref_addr:
- case DW_FORM_ref1:
- case DW_FORM_ref2:
- case DW_FORM_ref4:
- case DW_FORM_ref8:
- case DW_FORM_ref_udata:
- is_ref = 1;
- }
-
- switch (form)
- {
- case DW_FORM_ref_addr:
case DW_FORM_addr:
uvalue = byte_get (data, pointer_size);
- printf (is_ref ? " <%lx>" : " %#lx", uvalue);
data += pointer_size;
break;
case DW_FORM_flag:
case DW_FORM_data1:
uvalue = byte_get (data ++, 1);
- printf (is_ref ? " <%lx>" : " %ld", uvalue);
break;
case DW_FORM_ref2:
case DW_FORM_data2:
uvalue = byte_get (data, 2);
data += 2;
- printf (is_ref ? " <%lx>" : " %ld", uvalue);
break;
case DW_FORM_ref4:
case DW_FORM_data4:
uvalue = byte_get (data, 4);
data += 4;
- printf (is_ref ? " <%lx>" : " %ld", uvalue);
+ break;
+
+ case DW_FORM_sdata:
+ uvalue = read_leb128 (data, & bytes_read, 1);
+ data += bytes_read;
+ break;
+
+ case DW_FORM_ref_udata:
+ case DW_FORM_udata:
+ uvalue = read_leb128 (data, & bytes_read, 0);
+ data += bytes_read;
+ break;
+ }
+
+ switch (form)
+ {
+ case DW_FORM_ref_addr:
+ printf (" <#%lx>", uvalue);
+ break;
+
+ case DW_FORM_ref1:
+ case DW_FORM_ref2:
+ case DW_FORM_ref4:
+ case DW_FORM_ref_udata:
+ printf (" <%lx>", uvalue + cu_offset);
+ break;
+
+ case DW_FORM_addr:
+ printf (" %#lx", uvalue);
+
+ case DW_FORM_flag:
+ case DW_FORM_data1:
+ case DW_FORM_data2:
+ case DW_FORM_data4:
+ case DW_FORM_sdata:
+ case DW_FORM_udata:
+ printf (" %ld", uvalue);
break;
case DW_FORM_ref8:
data += strlen (data) + 1;
break;
- case DW_FORM_sdata:
- uvalue = read_leb128 (data, & bytes_read, 1);
- data += bytes_read;
- printf (" %ld", (long) uvalue);
- break;
-
- case DW_FORM_ref_udata:
- case DW_FORM_udata:
- uvalue = read_leb128 (data, & bytes_read, 0);
- data += bytes_read;
- printf (is_ref ? " <%lx>" : " %ld", uvalue);
- break;
-
case DW_FORM_block:
uvalue = read_leb128 (data, & bytes_read, 0);
block_start = data + bytes_read;
data = display_block (block_start, uvalue);
- uvalue = * block_start;
break;
case DW_FORM_block1:
uvalue = byte_get (data, 1);
block_start = data + 1;
data = display_block (block_start, uvalue);
- uvalue = * block_start;
break;
case DW_FORM_block2:
uvalue = byte_get (data, 2);
block_start = data + 2;
data = display_block (block_start, uvalue);
- uvalue = * block_start;
break;
case DW_FORM_block4:
uvalue = byte_get (data, 4);
block_start = data + 4;
data = display_block (block_start, uvalue);
- uvalue = * block_start;
break;
case DW_FORM_strp:
}
break;
- case DW_AT_frame_base:
- if (uvalue >= DW_OP_reg0 && uvalue <= DW_OP_reg31)
- printf ("(reg %ld)", uvalue - DW_OP_reg0);
- break;
-
case DW_AT_language:
switch (uvalue)
{
}
break;
+ case DW_AT_frame_base:
case DW_AT_location:
case DW_AT_data_member_location:
case DW_AT_vtable_elem_location:
- printf ("(");
- decode_location_expression (block_start, pointer_size);
- printf (")");
+ if (block_start)
+ {
+ printf ("(");
+ decode_location_expression (block_start, pointer_size, uvalue);
+ printf (")");
+ }
break;
default:
unsigned char * tags;
int i;
int level;
+ unsigned long cu_offset;
external = (DWARF2_External_CompUnit *) start;
compunit.cu_pointer_size = BYTE_GET (external->cu_pointer_size);
tags = start + sizeof (* external);
+ cu_offset = start - section_begin;
start += compunit.cu_length + sizeof (external->cu_length);
if (compunit.cu_version != 2)
for (attr = entry->first_attr; attr; attr = attr->next)
tags = read_and_display_attr (attr->attribute,
attr->form,
- tags,
+ tags, cu_offset,
compunit.cu_pointer_size);
if (entry->children)
Elf32_Lib liblist;
time_t time;
char timebuf[20];
+ struct tm * tmp;
liblist.l_name = BYTE_GET (elib[cnt].l_name);
time = BYTE_GET (elib[cnt].l_time_stamp);
liblist.l_version = BYTE_GET (elib[cnt].l_version);
liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
- strftime (timebuf, 20, "%Y-%m-%dT%H:%M:%S", gmtime (&time));
+ tmp = gmtime (&time);
+ sprintf (timebuf, "%04u-%02u-%02uT%02u:%02u:%02u",
+ tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
+ tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
printf ("%3lu: %-20s %s %#10lx %-7ld", (unsigned long) cnt,
dynamic_strings + liblist.l_name, timebuf,
external = pnotes;
printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"),
- (unsigned long) offset,
- (unsigned long) length);
+ (unsigned long) offset, (unsigned long) length);
printf (_(" Owner\t\tData size\tDescription\n"));
while (external < (Elf_External_Note *)((char *) pnotes + length))