projects
/
deliverable
/
binutils-gdb.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Use sigsetjmp/siglongjmp in opcodes
[deliverable/binutils-gdb.git]
/
binutils
/
objdump.c
diff --git
a/binutils/objdump.c
b/binutils/objdump.c
index 76ca2db726e0beadd82c36e18a0ddfca0ae7cc26..14f412214c96f7d849d70ae3ba17e283966abc51 100644
(file)
--- a/
binutils/objdump.c
+++ b/
binutils/objdump.c
@@
-1,7
+1,5
@@
/* objdump.c -- dump information about an object file.
/* objdump.c -- dump information about an object file.
- Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
- 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011,
- 2012 Free Software Foundation, Inc.
+ Copyright (C) 1990-2014 Free Software Foundation, Inc.
This file is part of GNU Binutils.
This file is part of GNU Binutils.
@@
-193,6
+191,7
@@
static const struct objdump_private_desc * const objdump_private_vectors[] =
NULL
};
\f
NULL
};
\f
+static void usage (FILE *, int) ATTRIBUTE_NORETURN;
static void
usage (FILE *stream, int status)
{
static void
usage (FILE *stream, int status)
{
@@
-216,7
+215,8
@@
usage (FILE *stream, int status)
-W[lLiaprmfFsoRt] or\n\
--dwarf[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,\n\
=frames-interp,=str,=loc,=Ranges,=pubtypes,\n\
-W[lLiaprmfFsoRt] or\n\
--dwarf[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,\n\
=frames-interp,=str,=loc,=Ranges,=pubtypes,\n\
- =gdb_index,=trace_info,=trace_abbrev,=trace_aranges]\n\
+ =gdb_index,=trace_info,=trace_abbrev,=trace_aranges,\n\
+ =addr,=cu_index]\n\
Display DWARF info in the file\n\
-t, --syms Display the contents of the symbol table(s)\n\
-T, --dynamic-syms Display the contents of the dynamic symbol table\n\
Display DWARF info in the file\n\
-t, --syms Display the contents of the symbol table(s)\n\
-T, --dynamic-syms Display the contents of the dynamic symbol table\n\
@@
-261,7
+261,9
@@
usage (FILE *stream, int status)
fprintf (stream, _("\
--dwarf-depth=N Do not display DIEs at depth N or greater\n\
--dwarf-start=N Display DIEs starting with N, at the same depth\n\
fprintf (stream, _("\
--dwarf-depth=N Do not display DIEs at depth N or greater\n\
--dwarf-start=N Display DIEs starting with N, at the same depth\n\
- or deeper\n\n"));
+ or deeper\n\
+ --dwarf-check Make additional dwarf internal consistency checks.\
+ \n\n"));
list_supported_targets (program_name, stream);
list_supported_architectures (program_name, stream);
list_supported_targets (program_name, stream);
list_supported_architectures (program_name, stream);
@@
-292,6
+294,7
@@
enum option_values
OPTION_INSN_WIDTH,
OPTION_ADJUST_VMA,
OPTION_DWARF_DEPTH,
OPTION_INSN_WIDTH,
OPTION_ADJUST_VMA,
OPTION_DWARF_DEPTH,
+ OPTION_DWARF_CHECK,
OPTION_DWARF_START
};
OPTION_DWARF_START
};
@@
-343,6
+346,7
@@
static struct option long_options[]=
{"insn-width", required_argument, NULL, OPTION_INSN_WIDTH},
{"dwarf-depth", required_argument, 0, OPTION_DWARF_DEPTH},
{"dwarf-start", required_argument, 0, OPTION_DWARF_START},
{"insn-width", required_argument, NULL, OPTION_INSN_WIDTH},
{"dwarf-depth", required_argument, 0, OPTION_DWARF_DEPTH},
{"dwarf-start", required_argument, 0, OPTION_DWARF_START},
+ {"dwarf-check", no_argument, 0, OPTION_DWARF_CHECK},
{0, no_argument, 0, 0}
};
\f
{0, no_argument, 0, 0}
};
\f
@@
-1082,6
+1086,7
@@
objdump_symbol_at_address (bfd_vma vma, struct disassemble_info * inf)
static char *prev_functionname;
static unsigned int prev_line;
static char *prev_functionname;
static unsigned int prev_line;
+static unsigned int prev_discriminator;
/* We keep a list of all files that we have seen when doing a
disassembly with source, so that we know how much of the file to
/* We keep a list of all files that we have seen when doing a
disassembly with source, so that we know how much of the file to
@@
-1123,25
+1128,28
@@
slurp_file (const char *fn, size_t *size)
if (fd < 0)
return NULL;
if (fstat (fd, &st) < 0)
if (fd < 0)
return NULL;
if (fstat (fd, &st) < 0)
- return NULL;
+ {
+ close (fd);
+ return NULL;
+ }
*size = st.st_size;
#ifdef HAVE_MMAP
msize = (*size + ps - 1) & ~(ps - 1);
map = mmap (NULL, msize, PROT_READ, MAP_SHARED, fd, 0);
*size = st.st_size;
#ifdef HAVE_MMAP
msize = (*size + ps - 1) & ~(ps - 1);
map = mmap (NULL, msize, PROT_READ, MAP_SHARED, fd, 0);
- if (map != (char *)-1L)
+ if (map != (char *)
-1L)
{
{
- close(fd);
- return map;
+ close
(fd);
+ return map;
}
#endif
map = (const char *) malloc (*size);
}
#endif
map = (const char *) malloc (*size);
- if (!map || (size_t) read (fd, (char *)
map, *size) != *size)
- {
- free ((void *)map);
+ if (!map || (size_t) read (fd, (char *)
map, *size) != *size)
+ {
+ free ((void *)
map);
map = NULL;
}
close (fd);
map = NULL;
}
close (fd);
- return map;
+ return map;
}
#define line_map_decrease 5
}
#define line_map_decrease 5
@@
-1227,7
+1235,7
@@
try_print_file_open (const char *origname, const char *modname)
return p;
}
return p;
}
-/* If the
the
source file, as described in the symtab, is not found
+/* If the source file, as described in the symtab, is not found
try to locate it in one of the paths specified with -I
If found, add location to print_files linked list. */
try to locate it in one of the paths specified with -I
If found, add location to print_files linked list. */
@@
-1305,13
+1313,15
@@
show_line (bfd *abfd, asection *section, bfd_vma addr_offset)
const char *filename;
const char *functionname;
unsigned int linenumber;
const char *filename;
const char *functionname;
unsigned int linenumber;
+ unsigned int discriminator;
bfd_boolean reloc;
if (! with_line_numbers && ! with_source_code)
return;
bfd_boolean reloc;
if (! with_line_numbers && ! with_source_code)
return;
- if (! bfd_find_nearest_line (abfd, section, syms, addr_offset, &filename,
- &functionname, &linenumber))
+ if (! bfd_find_nearest_line_discriminator (abfd, section, syms, addr_offset,
+ &filename, &functionname,
+ &linenumber, &discriminator))
return;
if (filename != NULL && *filename == '\0')
return;
if (filename != NULL && *filename == '\0')
@@
-1363,8
+1373,15
@@
show_line (bfd *abfd, asection *section, bfd_vma addr_offset)
&& (prev_functionname == NULL
|| strcmp (functionname, prev_functionname) != 0))
printf ("%s():\n", functionname);
&& (prev_functionname == NULL
|| strcmp (functionname, prev_functionname) != 0))
printf ("%s():\n", functionname);
- if (linenumber > 0 && linenumber != prev_line)
- printf ("%s:%u\n", filename == NULL ? "???" : filename, linenumber);
+ if (linenumber > 0 && (linenumber != prev_line ||
+ (discriminator != prev_discriminator)))
+ {
+ if (discriminator > 0)
+ printf ("%s:%u (discriminator %u)\n", filename == NULL ? "???" : filename,
+ linenumber, discriminator);
+ else
+ printf ("%s:%u\n", filename == NULL ? "???" : filename, linenumber);
+ }
}
if (with_source_code
}
if (with_source_code
@@
-1416,6
+1433,9
@@
show_line (bfd *abfd, asection *section, bfd_vma addr_offset)
if (linenumber > 0 && linenumber != prev_line)
prev_line = linenumber;
if (linenumber > 0 && linenumber != prev_line)
prev_line = linenumber;
+
+ if (discriminator != prev_discriminator)
+ prev_discriminator = discriminator;
}
/* Pseudo FILE object for strings. */
}
/* Pseudo FILE object for strings. */
@@
-1833,8
+1853,15
@@
disassemble_bytes (struct disassemble_info * inf,
if (q->addend)
{
if (q->addend)
{
- printf ("+0x");
- objdump_print_value (q->addend, inf, TRUE);
+ bfd_signed_vma addend = q->addend;
+ if (addend < 0)
+ {
+ printf ("-0x");
+ addend = -addend;
+ }
+ else
+ printf ("+0x");
+ objdump_print_value (addend, inf, TRUE);
}
printf ("\n");
}
printf ("\n");
@@
-1887,6
+1914,27
@@
disassemble_section (bfd *abfd, asection *section, void *inf)
if (datasize == 0)
return;
if (datasize == 0)
return;
+ if (start_address == (bfd_vma) -1
+ || start_address < section->vma)
+ addr_offset = 0;
+ else
+ addr_offset = start_address - section->vma;
+
+ if (stop_address == (bfd_vma) -1)
+ stop_offset = datasize / opb;
+ else
+ {
+ if (stop_address < section->vma)
+ stop_offset = 0;
+ else
+ stop_offset = stop_address - section->vma;
+ if (stop_offset > datasize / opb)
+ stop_offset = datasize / opb;
+ }
+
+ if (addr_offset >= stop_offset)
+ return;
+
/* Decide which set of relocs to use. Load them if necessary. */
paux = (struct objdump_disasm_info *) pinfo->application_data;
if (paux->dynrelbuf)
/* Decide which set of relocs to use. Load them if necessary. */
paux = (struct objdump_disasm_info *) pinfo->application_data;
if (paux->dynrelbuf)
@@
-1937,32
+1985,13
@@
disassemble_section (bfd *abfd, asection *section, void *inf)
pinfo->buffer_length = datasize;
pinfo->section = section;
pinfo->buffer_length = datasize;
pinfo->section = section;
- if (start_address == (bfd_vma) -1
- || start_address < pinfo->buffer_vma)
- addr_offset = 0;
- else
- addr_offset = start_address - pinfo->buffer_vma;
-
- if (stop_address == (bfd_vma) -1)
- stop_offset = datasize / opb;
- else
- {
- if (stop_address < pinfo->buffer_vma)
- stop_offset = 0;
- else
- stop_offset = stop_address - pinfo->buffer_vma;
- if (stop_offset > pinfo->buffer_length / opb)
- stop_offset = pinfo->buffer_length / opb;
- }
-
/* Skip over the relocs belonging to addresses below the
start address. */
while (rel_pp < rel_ppend
&& (*rel_pp)->address < rel_offset + addr_offset)
++rel_pp;
/* Skip over the relocs belonging to addresses below the
start address. */
while (rel_pp < rel_ppend
&& (*rel_pp)->address < rel_offset + addr_offset)
++rel_pp;
- if (addr_offset < stop_offset)
- printf (_("\nDisassembly of section %s:\n"), section->name);
+ printf (_("\nDisassembly of section %s:\n"), section->name);
/* Find the nearest symbol forwards from our current position. */
paux->require_sec = TRUE;
/* Find the nearest symbol forwards from our current position. */
paux->require_sec = TRUE;
@@
-2101,6
+2130,7
@@
disassemble_data (bfd *abfd)
print_files = NULL;
prev_functionname = NULL;
prev_line = -1;
print_files = NULL;
prev_functionname = NULL;
prev_line = -1;
+ prev_discriminator = 0;
/* We make a copy of syms to sort. We don't want to sort syms
because that will screw up the relocs. */
/* We make a copy of syms to sort. We don't want to sort syms
because that will screw up the relocs. */
@@
-2229,7
+2259,7
@@
load_specific_debug_section (enum dwarf_section_display_enum debug,
if (section->start != NULL)
return 1;
if (section->start != NULL)
return 1;
- section->address =
0
;
+ section->address =
bfd_get_section_vma (abfd, sec)
;
section->size = bfd_get_section_size (sec);
section->start = NULL;
ret = bfd_get_full_section_contents (abfd, sec, §ion->start);
section->size = bfd_get_section_size (sec);
section->start = NULL;
ret = bfd_get_full_section_contents (abfd, sec, §ion->start);
@@
-2244,13
+2274,7
@@
load_specific_debug_section (enum dwarf_section_display_enum debug,
if (is_relocatable && debug_displays [debug].relocate)
{
if (is_relocatable && debug_displays [debug].relocate)
{
- /* We want to relocate the data we've already read (and
- decompressed), so we store a pointer to the data in
- the bfd_section, and tell it that the contents are
- already in memory. */
- sec->contents = section->start;
- sec->flags |= SEC_IN_MEMORY;
- sec->size = section->size;
+ bfd_cache_section_contents (sec, section->start);
ret = bfd_simple_get_relocated_section_contents (abfd,
sec,
ret = bfd_simple_get_relocated_section_contents (abfd,
sec,
@@
-2370,6
+2394,10
@@
dump_dwarf (bfd *abfd)
{
case bfd_mach_x86_64:
case bfd_mach_x86_64_intel_syntax:
{
case bfd_mach_x86_64:
case bfd_mach_x86_64_intel_syntax:
+ case bfd_mach_x86_64_nacl:
+ case bfd_mach_x64_32:
+ case bfd_mach_x64_32_intel_syntax:
+ case bfd_mach_x64_32_nacl:
init_dwarf_regnames_x86_64 ();
break;
init_dwarf_regnames_x86_64 ();
break;
@@
-2626,7
+2654,7
@@
dump_target_specific (bfd *abfd)
if ((*desc)->filter (abfd))
break;
if ((*desc)->filter (abfd))
break;
- if (desc == NULL)
+ if (
*
desc == NULL)
{
non_fatal (_("option -P/--private not supported by this file"));
return;
{
non_fatal (_("option -P/--private not supported by this file"));
return;
@@
-2881,6
+2909,7
@@
dump_reloc_set (bfd *abfd, asection *sec, arelent **relpp, long relcount)
arelent **p;
char *last_filename, *last_functionname;
unsigned int last_line;
arelent **p;
char *last_filename, *last_functionname;
unsigned int last_line;
+ unsigned int last_discriminator;
/* Get column headers lined up reasonably. */
{
/* Get column headers lined up reasonably. */
{
@@
-2899,12
+2928,14
@@
dump_reloc_set (bfd *abfd, asection *sec, arelent **relpp, long relcount)
last_filename = NULL;
last_functionname = NULL;
last_line = 0;
last_filename = NULL;
last_functionname = NULL;
last_line = 0;
+ last_discriminator = 0;
for (p = relpp; relcount && *p != NULL; p++, relcount--)
{
arelent *q = *p;
const char *filename, *functionname;
unsigned int linenumber;
for (p = relpp; relcount && *p != NULL; p++, relcount--)
{
arelent *q = *p;
const char *filename, *functionname;
unsigned int linenumber;
+ unsigned int discriminator;
const char *sym_name;
const char *section_name;
bfd_vma addend2 = 0;
const char *sym_name;
const char *section_name;
bfd_vma addend2 = 0;
@@
-2918,8
+2949,9
@@
dump_reloc_set (bfd *abfd, asection *sec, arelent **relpp, long relcount)
if (with_line_numbers
&& sec != NULL
if (with_line_numbers
&& sec != NULL
- && bfd_find_nearest_line (abfd, sec, syms, q->address,
- &filename, &functionname, &linenumber))
+ && bfd_find_nearest_line_discriminator (abfd, sec, syms, q->address,
+ &filename, &functionname,
+ &linenumber, &discriminator))
{
if (functionname != NULL
&& (last_functionname == NULL
{
if (functionname != NULL
&& (last_functionname == NULL
@@
-2935,10
+2967,16
@@
dump_reloc_set (bfd *abfd, asection *sec, arelent **relpp, long relcount)
&& (linenumber != last_line
|| (filename != NULL
&& last_filename != NULL
&& (linenumber != last_line
|| (filename != NULL
&& last_filename != NULL
- && filename_cmp (filename, last_filename) != 0)))
+ && filename_cmp (filename, last_filename) != 0)
+ || (discriminator != last_discriminator)))
{
{
- printf ("%s:%u\n", filename == NULL ? "???" : filename, linenumber);
+ if (discriminator > 0)
+ printf ("%s:%u\n", filename == NULL ? "???" : filename, linenumber);
+ else
+ printf ("%s:%u (discriminator %u)\n", filename == NULL ? "???" : filename,
+ linenumber, discriminator);
last_line = linenumber;
last_line = linenumber;
+ last_discriminator = discriminator;
if (last_filename != NULL)
free (last_filename);
if (filename == NULL)
if (last_filename != NULL)
free (last_filename);
if (filename == NULL)
@@
-3010,8
+3048,15
@@
dump_reloc_set (bfd *abfd, asection *sec, arelent **relpp, long relcount)
if (q->addend)
{
if (q->addend)
{
- printf ("+0x");
- bfd_printf_vma (abfd, q->addend);
+ bfd_signed_vma addend = q->addend;
+ if (addend < 0)
+ {
+ printf ("-0x");
+ addend = -addend;
+ }
+ else
+ printf ("+0x");
+ bfd_printf_vma (abfd, addend);
}
if (addend2)
{
}
if (addend2)
{
@@
-3170,8
+3215,6
@@
dump_bfd (bfd *abfd)
dump_target_specific (abfd);
if (! dump_debugging_tags && ! suppress_bfd_header)
putchar ('\n');
dump_target_specific (abfd);
if (! dump_debugging_tags && ! suppress_bfd_header)
putchar ('\n');
- if (dump_section_headers)
- dump_headers (abfd);
if (dump_symtab
|| dump_reloc_info
if (dump_symtab
|| dump_reloc_info
@@
-3179,6
+3222,10
@@
dump_bfd (bfd *abfd)
|| dump_debugging
|| dump_dwarf_section_info)
syms = slurp_symtab (abfd);
|| dump_debugging
|| dump_dwarf_section_info)
syms = slurp_symtab (abfd);
+
+ if (dump_section_headers)
+ dump_headers (abfd);
+
if (dump_dynamic_symtab || dump_dynamic_reloc_info
|| (disassemble && bfd_get_dynamic_symtab_upper_bound (abfd) > 0))
dynsyms = slurp_dynamic_symtab (abfd);
if (dump_dynamic_symtab || dump_dynamic_reloc_info
|| (disassemble && bfd_get_dynamic_symtab_upper_bound (abfd) > 0))
dynsyms = slurp_dynamic_symtab (abfd);
@@
-3227,6
+3274,7
@@
dump_bfd (bfd *abfd)
info in the file, try DWARF instead. */
else if (! dump_dwarf_section_info)
{
info in the file, try DWARF instead. */
else if (! dump_dwarf_section_info)
{
+ dwarf_select_sections_all ();
dump_dwarf (abfd);
}
}
dump_dwarf (abfd);
}
}
@@
-3583,6
+3631,9
@@
main (int argc, char **argv)
suppress_bfd_header = 1;
}
break;
suppress_bfd_header = 1;
}
break;
+ case OPTION_DWARF_CHECK:
+ dwarf_check = TRUE;
+ break;
case 'G':
dump_stab_section_info = TRUE;
seenflag = TRUE;
case 'G':
dump_stab_section_info = TRUE;
seenflag = TRUE;
@@
-3607,15
+3658,15
@@
main (int argc, char **argv)
dump_section_headers = TRUE;
seenflag = TRUE;
break;
dump_section_headers = TRUE;
seenflag = TRUE;
break;
- case 'H':
- usage (stdout, 0);
- seenflag = TRUE;
case 'v':
case 'V':
show_version = TRUE;
seenflag = TRUE;
break;
case 'v':
case 'V':
show_version = TRUE;
seenflag = TRUE;
break;
+ case 'H':
+ usage (stdout, 0);
+ /* No need to set seenflag or to break - usage() does not return. */
default:
usage (stderr, 1);
}
default:
usage (stderr, 1);
}
This page took
0.028597 seconds
and
4
git commands to generate.