extern int fprintf PARAMS ((FILE *, const char *, ...));
#endif
+/* Exit status. */
+static int exit_status = 0;
+
static char *default_target = NULL; /* default at runtime */
static int show_version = 0; /* show the version number */
/* Architecture to disassemble for, or default if NULL. */
static char *machine = (char *) NULL;
+/* Target specific options to the disassembler. */
+static char *disassembler_options = (char *) NULL;
+
/* Endianness to disassemble for, or default if BFD_ENDIAN_UNKNOWN. */
static enum bfd_endian endian = BFD_ENDIAN_UNKNOWN;
static void
usage PARAMS ((FILE *, int));
+static void
+nonfatal PARAMS ((const char *));
+
static void
display_file PARAMS ((char *filename, char *target));
int status;
{
fprintf (stream, _("\
-Usage: %s [-ahifCdDprRtTxsSlw] [-b bfdname] [-m machine] [-j section-name]\n\
+Usage: %s [-ahifCdDprRtTxsSlw] [-b bfdname] [-m machine] \n\
+ [-j section-name] [-M disassembler-options]\n\
[--archive-headers] [--target=bfdname] [--debugging] [--disassemble]\n\
[--disassemble-all] [--disassemble-zeroes] [--file-headers]\n\
[--section-headers] [--headers]\n\
{"demangle", no_argument, &do_demangle, 1},
{"disassemble", no_argument, NULL, 'd'},
{"disassemble-all", no_argument, NULL, 'D'},
+ {"disassembler-options", required_argument, NULL, 'M'},
{"disassemble-zeroes", no_argument, &disassemble_zeroes, 1},
{"dynamic-reloc", no_argument, NULL, 'R'},
{"dynamic-syms", no_argument, NULL, 'T'},
};
\f
static void
+nonfatal (msg)
+ const char *msg;
+{
+ bfd_nonfatal (msg);
+ exit_status = 1;
+}
+\f
+static void
dump_section_header (abfd, section, ignored)
- bfd *abfd;
+ bfd *abfd ATTRIBUTE_UNUSED;
asection *section;
- PTR ignored;
+ PTR ignored ATTRIBUTE_UNUSED;
{
char *comma = "";
PF (SEC_NEVER_LOAD, "NEVER_LOAD");
PF (SEC_EXCLUDE, "EXCLUDE");
PF (SEC_SORT_ENTRIES, "SORT_ENTRIES");
+ PF (SEC_SMALL_DATA, "SMALL_DATA");
+ PF (SEC_SHARED, "SHARED");
if ((section->flags & SEC_LINK_ONCE) != 0)
{
break;
}
printf ("%s%s", comma, ls);
+
+ if (section->comdat != NULL)
+ printf (" (COMDAT %s %ld)", section->comdat->name,
+ section->comdat->symbol);
+
comma = ", ";
}
n = strlen (buf);
- while ((f->buffer + f->size) - f->current < n + 1)
+ while ((size_t) ((f->buffer + f->size) - f->current) < n + 1)
{
size_t curroff;
if (info->bytes_per_line != 0)
bytes_per_line = info->bytes_per_line;
if (bytes < 0)
- break;
+ {
+ if (sfile.current != sfile.buffer)
+ printf ("%s\n", sfile.buffer);
+ free (sfile.buffer);
+ break;
+ }
}
else
{
- long j;
+ bfd_vma j;
bytes = bytes_per_line;
if (i + bytes > stop)
? show_raw_insn > 0
: show_raw_insn >= 0)
{
- long j;
+ bfd_vma j;
/* If ! prefix_addresses and ! wide_output, we print
bytes_per_line bytes per line. */
{
while (pb < bytes)
{
- long j;
+ bfd_vma j;
char *s;
putchar ('\n');
fprintf (stderr, _("%s: Can't disassemble for architecture %s\n"),
program_name,
bfd_printable_arch_mach (bfd_get_arch (abfd), 0));
+ exit_status = 1;
return;
}
disasm_info.flavour = bfd_get_flavour (abfd);
disasm_info.arch = bfd_get_arch (abfd);
disasm_info.mach = bfd_get_mach (abfd);
+ disasm_info.disassembler_options = disassembler_options;
+
if (bfd_big_endian (abfd))
- disasm_info.endian = BFD_ENDIAN_BIG;
+ disasm_info.display_endian = disasm_info.endian = BFD_ENDIAN_BIG;
else if (bfd_little_endian (abfd))
- disasm_info.endian = BFD_ENDIAN_LITTLE;
+ disasm_info.display_endian = disasm_info.endian = BFD_ENDIAN_LITTLE;
else
/* ??? Aborting here seems too drastic. We could default to big or little
instead. */
{
fprintf (stderr, _("%s: %s has no %s section\n"), program_name,
bfd_get_filename (abfd), strsect_name);
+ exit_status = 1;
return false;
}
bfd_errmsg (bfd_get_error ()));
free (stabs);
free (strtab);
+ exit_status = 1;
return false;
}
bfd_errmsg (bfd_get_error ()));
free (stabs);
free (strtab);
+ exit_status = 1;
return false;
}
print_section_stabs (abfd, stabsect_name, strsect_name)
bfd *abfd;
const char *stabsect_name;
- const char *strsect_name;
+ const char *strsect_name ATTRIBUTE_UNUSED;
{
int i;
unsigned file_string_table_offset = 0, next_file_string_table_offset = 0;
if (!bfd_check_format_matches (abfd, bfd_object, &matching))
{
- bfd_nonfatal (bfd_get_filename (abfd));
+ nonfatal (bfd_get_filename (abfd));
if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
{
list_matching_formats (matching);
if (dhandle != NULL)
{
if (! print_debugging_info (stdout, dhandle))
- fprintf (stderr, _("%s: printing debugging information failed\n"),
- bfd_get_filename (abfd));
+ {
+ fprintf (stderr,
+ _("%s: printing debugging information failed\n"),
+ bfd_get_filename (abfd));
+ exit_status = 1;
+ }
}
}
if (syms)
file = bfd_openr (filename, target);
if (file == NULL)
{
- bfd_nonfatal (filename);
+ nonfatal (filename);
return;
}
if (arfile == NULL)
{
if (bfd_get_error () != bfd_error_no_more_archived_files)
- {
- bfd_nonfatal (bfd_get_filename (file));
- }
+ nonfatal (bfd_get_filename (file));
break;
}
/* Should perhaps share code and display with nm? */
static void
dump_symbols (abfd, dynamic)
- bfd *abfd;
+ bfd *abfd ATTRIBUTE_UNUSED;
boolean dynamic;
{
asymbol **current;
if (sym_name)
{
printf_vma (q->address);
- printf (" %-16s ", q->howto->name);
+ if (q->howto->name)
+ printf (" %-16s ", q->howto->name);
+ else
+ printf (" %-16d ", q->howto->type);
objdump_print_symname (abfd, (struct disassemble_info *) NULL,
*q->sym_ptr_ptr);
}
if (abfd == NULL)
{
- bfd_nonfatal (dummy_name);
+ nonfatal (dummy_name);
continue;
}
if (! bfd_set_format (abfd, bfd_object))
{
if (bfd_get_error () != bfd_error_invalid_operation)
- bfd_nonfatal (p->name);
+ nonfatal (p->name);
continue;
}
if (abfd == NULL)
{
- bfd_nonfatal (p->name);
+ nonfatal (p->name);
ok = false;
}
if (! bfd_set_format (abfd, bfd_object))
{
if (bfd_get_error () != bfd_error_invalid_operation)
- bfd_nonfatal (p->name);
+ nonfatal (p->name);
ok = false;
}
}
bfd_init ();
set_default_bfd_target ();
- while ((c = getopt_long (argc, argv, "pib:m:VCdDlfahrRtTxsSj:wE:",
+ while ((c = getopt_long (argc, argv, "pib:m:M:VCdDlfahrRtTxsSj:wE:",
long_options, (int *) 0))
!= EOF)
{
case 'm':
machine = optarg;
break;
+ case 'M':
+ disassembler_options = optarg;
+ break;
case 'j':
only = optarg;
break;
endian = BFD_ENDIAN_LITTLE;
else
{
- fprintf (stderr, _("%s: unrecognized -E option\n"), program_name);
+ fprintf (stderr, _("%s: unrecognized -E option\n"),
+ program_name);
usage (stderr, 1);
}
break;
END_PROGRESS (program_name);
- return 0;
+ return exit_status;
}