daily update
[binutils-gdb.git] / binutils / objdump.c
index ff1778e7370062e77c44b4133e104298fda1e614..3c927bd7ae952a054d64ca8c5aaeedf362baf7fc 100644 (file)
@@ -1,6 +1,6 @@
 /* objdump.c -- dump information about an object file.
    Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-   2000, 2001, 2002
+   2000, 2001, 2002, 2003
    Free Software Foundation, Inc.
 
    This file is part of GNU Binutils.
@@ -20,6 +20,7 @@
    Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
 #include "bfd.h"
+#include "bfdver.h"
 #include "progress.h"
 #include "bucomm.h"
 #include "budemang.h"
 
 #ifdef NEED_DECLARATION_FPRINTF
 /* This is needed by INIT_DISASSEMBLE_INFO.  */
-extern int fprintf PARAMS ((FILE *, const char *, ...));
+extern int fprintf
+  PARAMS ((FILE *, const char *, ...));
 #endif
 
 /* Exit status.  */
 static int exit_status = 0;
 
-static char *default_target = NULL;    /* default at runtime */
+static char *default_target = NULL;    /* Default at runtime.  */
 
-static int show_version = 0;           /* show the version number */
+static int show_version = 0;           /* Show the version number.  */
 static int dump_section_contents;      /* -s */
 static int dump_section_headers;       /* -h */
-static boolean dump_file_header;       /* -f */
+static bfd_boolean dump_file_header;   /* -f */
 static int dump_symtab;                        /* -t */
 static int dump_dynamic_symtab;                /* -T */
 static int dump_reloc_info;            /* -r */
@@ -57,14 +59,14 @@ static int dump_ar_hdrs;            /* -a */
 static int dump_private_headers;       /* -p */
 static int prefix_addresses;           /* --prefix-addresses */
 static int with_line_numbers;          /* -l */
-static boolean with_source_code;       /* -S */
+static bfd_boolean with_source_code;   /* -S */
 static int show_raw_insn;              /* --show-raw-insn */
 static int dump_stab_section_info;     /* --stabs */
 static int do_demangle;                        /* -C, --demangle */
-static boolean disassemble;            /* -d */
-static boolean disassemble_all;                /* -D */
+static bfd_boolean disassemble;                /* -d */
+static bfd_boolean disassemble_all;    /* -D */
 static int disassemble_zeroes;         /* --disassemble-zeroes */
-static boolean formats_info;           /* -i */
+static bfd_boolean formats_info;       /* -i */
 static char *only;                     /* -j secname */
 static int wide_output;                        /* -w */
 static bfd_vma start_address = (bfd_vma) -1; /* --start-address */
@@ -74,10 +76,11 @@ static bfd_vma adjust_section_vma = 0;      /* --adjust-vma */
 static int file_start_context = 0;      /* --file-start-context */
 
 /* Extra info to pass to the disassembler address printing function.  */
-struct objdump_disasm_info {
+struct objdump_disasm_info
+{
   bfd *abfd;
   asection *sec;
-  boolean require_sec;
+  bfd_boolean require_sec;
 };
 
 /* Architecture to disassemble for, or default if NULL.  */
@@ -107,55 +110,82 @@ static asymbol **dynsyms;
 /* Number of symbols in `dynsyms'.  */
 static long dynsymcount = 0;
 
+static bfd_byte *stabs;
+static bfd_size_type stab_size;
+
+static char *strtab;
+static bfd_size_type stabstr_size;
+
 /* Static declarations.  */
 
-static void usage PARAMS ((FILE *, int));
-static void nonfatal PARAMS ((const char *));
-static void display_file PARAMS ((char *filename, char *target));
-static void dump_section_header PARAMS ((bfd *, asection *, PTR));
-static void dump_headers PARAMS ((bfd *));
-static void dump_data PARAMS ((bfd *abfd));
-static void dump_relocs PARAMS ((bfd *abfd));
-static void dump_dynamic_relocs PARAMS ((bfd * abfd));
-static void dump_reloc_set PARAMS ((bfd *, asection *, arelent **, long));
-static void dump_symbols PARAMS ((bfd *abfd, boolean dynamic));
-static void dump_bfd_header PARAMS ((bfd *));
-static void dump_bfd_private_header PARAMS ((bfd *));
-static void dump_bfd PARAMS ((bfd *));
-static void display_bfd PARAMS ((bfd *abfd));
-static void display_target_list PARAMS ((void));
-static void display_info_table PARAMS ((int, int));
-static void display_target_tables PARAMS ((void));
-static void display_info PARAMS ((void));
+static void usage
+  PARAMS ((FILE *, int));
+static void nonfatal
+  PARAMS ((const char *));
+static void display_file
+  PARAMS ((char *, char *));
+static void dump_section_header
+  PARAMS ((bfd *, asection *, PTR));
+static void dump_headers
+  PARAMS ((bfd *));
+static void dump_data
+  PARAMS ((bfd *));
+static void dump_relocs
+  PARAMS ((bfd *));
+static void dump_dynamic_relocs
+  PARAMS ((bfd *));
+static void dump_reloc_set
+  PARAMS ((bfd *, asection *, arelent **, long));
+static void dump_symbols
+  PARAMS ((bfd *, bfd_boolean));
+static void dump_bfd_header
+  PARAMS ((bfd *));
+static void dump_bfd_private_header
+  PARAMS ((bfd *));
+static void dump_bfd
+  PARAMS ((bfd *));
+static void display_bfd
+  PARAMS ((bfd *));
 static void objdump_print_value
-  PARAMS ((bfd_vma, struct disassemble_info *, boolean));
+  PARAMS ((bfd_vma, struct disassemble_info *, bfd_boolean));
 static void objdump_print_symname
   PARAMS ((bfd *, struct disassemble_info *, asymbol *));
 static asymbol *find_symbol_for_address
-  PARAMS ((bfd *, asection *, bfd_vma, boolean, long *));
+  PARAMS ((bfd *, asection *, bfd_vma, bfd_boolean, long *));
 static void objdump_print_addr_with_sym
   PARAMS ((bfd *, asection *, asymbol *, bfd_vma,
-          struct disassemble_info *, boolean));
+          struct disassemble_info *, bfd_boolean));
 static void objdump_print_addr
-  PARAMS ((bfd_vma, struct disassemble_info *, boolean));
+  PARAMS ((bfd_vma, struct disassemble_info *, bfd_boolean));
 static void objdump_print_address
   PARAMS ((bfd_vma, struct disassemble_info *));
 static int objdump_symbol_at_address
   PARAMS ((bfd_vma, struct disassemble_info *));
-static void show_line PARAMS ((bfd *, asection *, bfd_vma));
+static void show_line
+  PARAMS ((bfd *, asection *, bfd_vma));
 static void disassemble_bytes
-  PARAMS ((struct disassemble_info *, disassembler_ftype, boolean,
+  PARAMS ((struct disassemble_info *, disassembler_ftype, bfd_boolean,
           bfd_byte *, bfd_vma, bfd_vma, arelent ***, arelent **));
-static void disassemble_data PARAMS ((bfd *));
-static const char *endian_string PARAMS ((enum bfd_endian));
-static asymbol ** slurp_symtab PARAMS ((bfd *));
-static asymbol ** slurp_dynamic_symtab PARAMS ((bfd *));
-static long remove_useless_symbols PARAMS ((asymbol **, long));
-static int compare_symbols PARAMS ((const PTR, const PTR));
-static int compare_relocs PARAMS ((const PTR, const PTR));
-static void dump_stabs PARAMS ((bfd *));
-static boolean read_section_stabs PARAMS ((bfd *, const char *, const char *));
-static void print_section_stabs PARAMS ((bfd *, const char *, const char *));
+static void disassemble_data
+  PARAMS ((bfd *));
+static asymbol ** slurp_symtab
+  PARAMS ((bfd *));
+static asymbol ** slurp_dynamic_symtab
+  PARAMS ((bfd *));
+static long remove_useless_symbols
+  PARAMS ((asymbol **, long));
+static int compare_symbols
+  PARAMS ((const PTR, const PTR));
+static int compare_relocs
+  PARAMS ((const PTR, const PTR));
+static void dump_stabs
+  PARAMS ((bfd *));
+static bfd_boolean read_section_stabs
+  PARAMS ((bfd *, const char *, const char *));
+static void print_section_stabs
+  PARAMS ((bfd *, const char *, const char *));
+static void dump_section_stabs
+  PARAMS ((bfd *, char *, char *));
 \f
 static void
 usage (stream, status)
@@ -198,12 +228,13 @@ usage (stream, status)
       --file-start-context       Include context from start of file (with -S)\n\
   -l, --line-numbers             Include line numbers and filenames in output\n\
   -C, --demangle[=STYLE]         Decode mangled/processed symbol names\n\
-                                  The STYLE, if specified, can be `auto', 'gnu',\n\
-                                  'lucid', 'arm', 'hp', 'edg', or 'gnu-v3'\n\
+                                  The STYLE, if specified, can be `auto', `gnu',\n\
+                                  `lucid', `arm', `hp', `edg', `gnu-v3', `java'\n\
+                                  or `gnat'\n\
   -w, --wide                     Format output for more than 80 columns\n\
   -z, --disassemble-zeroes       Do not skip blocks of zeroes when disassembling\n\
-      --start-address=ADDR       Only process data whoes address is >= ADDR\n\
-      --stop-address=ADDR        Only process data whoes address is <= ADDR\n\
+      --start-address=ADDR       Only process data whose address is >= ADDR\n\
+      --stop-address=ADDR        Only process data whose address is <= ADDR\n\
       --prefix-addresses         Print complete address alongside disassembly\n\
       --[no-]show-raw-insn       Display hex alongside symbolic disassembly\n\
       --adjust-vma=OFFSET        Add OFFSET to all displayed section addresses\n\
@@ -369,6 +400,8 @@ dump_headers (abfd)
 
   if (wide_output)
     printf (_("  Flags"));
+  if (abfd->flags & HAS_LOAD_PAGE)
+    printf (_("  Pg"));
   printf ("\n");
 
   bfd_map_over_sections (abfd, dump_section_header, (PTR) NULL);
@@ -383,7 +416,6 @@ slurp_symtab (abfd)
 
   if (!(bfd_get_file_flags (abfd) & HAS_SYMS))
     {
-      non_fatal (_("%s: no symbols"), bfd_get_filename (abfd));
       symcount = 0;
       return NULL;
     }
@@ -397,8 +429,6 @@ slurp_symtab (abfd)
   symcount = bfd_canonicalize_symtab (abfd, sy);
   if (symcount < 0)
     bfd_fatal (bfd_get_filename (abfd));
-  if (symcount == 0)
-    non_fatal (_("%s: no symbols"), bfd_get_filename (abfd));
   return sy;
 }
 
@@ -429,8 +459,6 @@ slurp_dynamic_symtab (abfd)
   dynsymcount = bfd_canonicalize_dynamic_symtab (abfd, sy);
   if (dynsymcount < 0)
     bfd_fatal (bfd_get_filename (abfd));
-  if (dynsymcount == 0)
-    non_fatal (_("%s: No dynamic symbols"), bfd_get_filename (abfd));
   return sy;
 }
 
@@ -473,7 +501,7 @@ compare_symbols (ap, bp)
   const asymbol *b = *(const asymbol **)bp;
   const char *an, *bn;
   size_t anl, bnl;
-  boolean af, bf;
+  bfd_boolean af, bf;
   flagword aflags, bflags;
 
   if (bfd_asymbol_value (a) > bfd_asymbol_value (b))
@@ -493,7 +521,6 @@ compare_symbols (ap, bp)
 
   /* The symbols gnu_compiled and gcc2_compiled convey no real
      information, so put them after other symbols with the same value.  */
-
   af = (strstr (an, "gnu_compiled") != NULL
        || strstr (an, "gcc2_compiled") != NULL);
   bf = (strstr (bn, "gnu_compiled") != NULL
@@ -595,13 +622,13 @@ compare_relocs (ap, bp)
     return 0;
 }
 
-/* Print VMA to STREAM.  If SKIP_ZEROES is true, omit leading zeroes.  */
+/* Print VMA to STREAM.  If SKIP_ZEROES is TRUE, omit leading zeroes.  */
 
 static void
 objdump_print_value (vma, info, skip_zeroes)
      bfd_vma vma;
      struct disassemble_info *info;
-     boolean skip_zeroes;
+     bfd_boolean skip_zeroes;
 {
   char buf[30];
   char *p;
@@ -651,7 +678,7 @@ objdump_print_symname (abfd, info, sym)
 }
 
 /* Locate a symbol given a bfd, a section, and a VMA.  If REQUIRE_SEC
-   is true, then always require the symbol to be in the section.  This
+   is TRUE, then always require the symbol to be in the section.  This
    returns NULL if there is no suitable symbol.  If PLACE is not NULL,
    then *PLACE is set to the index of the symbol in sorted_syms.  */
 
@@ -660,7 +687,7 @@ find_symbol_for_address (abfd, sec, vma, require_sec, place)
      bfd *abfd;
      asection *sec;
      bfd_vma vma;
-     boolean require_sec;
+     bfd_boolean require_sec;
      long *place;
 {
   /* @@ Would it speed things up to cache the last two symbols returned,
@@ -714,7 +741,6 @@ find_symbol_for_address (abfd, sec, vma, require_sec, place)
      sections have overlapping memory ranges, but in that case there's
      no way to tell what's desired without looking at the relocation
      table.  */
-
   if (sorted_syms[thisplace]->section != sec
       && (require_sec
          || ((abfd->flags & HAS_RELOC) != 0
@@ -730,7 +756,9 @@ find_symbol_for_address (abfd, sec, vma, require_sec, place)
              != bfd_asymbol_value (sorted_syms[thisplace]))
            break;
        }
+
       --i;
+
       for (; i >= 0; i--)
        {
          if (sorted_syms[i]->section == sec
@@ -785,7 +813,7 @@ objdump_print_addr_with_sym (abfd, sec, sym, vma, info, skip_zeroes)
      asymbol *sym;
      bfd_vma vma;
      struct disassemble_info *info;
-     boolean skip_zeroes;
+     bfd_boolean skip_zeroes;
 {
   objdump_print_value (vma, info, skip_zeroes);
 
@@ -799,12 +827,12 @@ objdump_print_addr_with_sym (abfd, sec, sym, vma, info, skip_zeroes)
       if (vma < secaddr)
        {
          (*info->fprintf_func) (info->stream, "-0x");
-         objdump_print_value (secaddr - vma, info, true);
+         objdump_print_value (secaddr - vma, info, TRUE);
        }
       else if (vma > secaddr)
        {
          (*info->fprintf_func) (info->stream, "+0x");
-         objdump_print_value (vma - secaddr, info, true);
+         objdump_print_value (vma - secaddr, info, TRUE);
        }
       (*info->fprintf_func) (info->stream, ">");
     }
@@ -815,25 +843,25 @@ objdump_print_addr_with_sym (abfd, sec, sym, vma, info, skip_zeroes)
       if (bfd_asymbol_value (sym) > vma)
        {
          (*info->fprintf_func) (info->stream, "-0x");
-         objdump_print_value (bfd_asymbol_value (sym) - vma, info, true);
+         objdump_print_value (bfd_asymbol_value (sym) - vma, info, TRUE);
        }
       else if (vma > bfd_asymbol_value (sym))
        {
          (*info->fprintf_func) (info->stream, "+0x");
-         objdump_print_value (vma - bfd_asymbol_value (sym), info, true);
+         objdump_print_value (vma - bfd_asymbol_value (sym), info, TRUE);
        }
       (*info->fprintf_func) (info->stream, ">");
     }
 }
 
 /* Print VMA to INFO, symbolically if possible.  If SKIP_ZEROES is
-   true, don't output leading zeroes.  */
+   TRUE, don't output leading zeroes.  */
 
 static void
 objdump_print_addr (vma, info, skip_zeroes)
      bfd_vma vma;
      struct disassemble_info *info;
-     boolean skip_zeroes;
+     bfd_boolean skip_zeroes;
 {
   struct objdump_disasm_info *aux;
   asymbol *sym;
@@ -912,14 +940,14 @@ static struct print_file_list *print_files;
 /* Skip ahead to a given line in a file, optionally printing each
    line.  */
 
-static void
-skip_to_line PARAMS ((struct print_file_list *, unsigned int, boolean));
+static void skip_to_line
+  PARAMS ((struct print_file_list *, unsigned int, bfd_boolean));
 
 static void
 skip_to_line (p, line, show)
      struct print_file_list *p;
      unsigned int line;
-     boolean show;
+     bfd_boolean show;
 {
   while (p->line < line)
     {
@@ -1018,7 +1046,7 @@ show_line (abfd, section, addr_offset)
                  p->line = 0;
                }
              if (p->f != NULL)
-               skip_to_line (p, l, false);
+               skip_to_line (p, l, FALSE);
 
              if (print_files->f != NULL)
                {
@@ -1029,7 +1057,7 @@ show_line (abfd, section, addr_offset)
 
          if (p->f != NULL)
            {
-             skip_to_line (p, line, true);
+             skip_to_line (p, line, TRUE);
              *pp = p->next;
              p->next = print_files;
              print_files = p;
@@ -1065,9 +1093,9 @@ show_line (abfd, section, addr_offset)
                l = line - SHOW_PRECEDING_CONTEXT_LINES;
              if (l < 0)
                l = 0;
-             skip_to_line (p, l, false);
+             skip_to_line (p, l, FALSE);
              if (p->f != NULL)
-               skip_to_line (p, line, true);
+               skip_to_line (p, line, TRUE);
            }
        }
     }
@@ -1162,7 +1190,7 @@ disassemble_bytes (info, disassemble_fn, insns, data,
                   relppend)
      struct disassemble_info *info;
      disassembler_ftype disassemble_fn;
-     boolean insns;
+     bfd_boolean insns;
      bfd_byte *data;
      bfd_vma start_offset;
      bfd_vma stop_offset;
@@ -1172,7 +1200,7 @@ disassemble_bytes (info, disassemble_fn, insns, data,
   struct objdump_disasm_info *aux;
   asection *section;
   int octets_per_line;
-  boolean done_dot;
+  bfd_boolean done_dot;
   int skip_addr_chars;
   bfd_vma addr_offset;
   int opb = info->octets_per_byte;
@@ -1210,13 +1238,13 @@ disassemble_bytes (info, disassemble_fn, insns, data,
 
   info->insn_info_valid = 0;
 
-  done_dot = false;
+  done_dot = FALSE;
   addr_offset = start_offset;
   while (addr_offset < stop_offset)
     {
       bfd_vma z;
       int octets = 0;
-      boolean need_nl = false;
+      bfd_boolean need_nl = FALSE;
 
       /* If we see more than SKIP_ZEROES octets of zeroes, we just
          print `...'.  */
@@ -1248,7 +1276,7 @@ disassemble_bytes (info, disassemble_fn, insns, data,
          int bpc = 0;
          int pb = 0;
 
-         done_dot = false;
+         done_dot = FALSE;
 
          if (with_line_numbers || with_source_code)
            /* The line number tables will refer to unadjusted
@@ -1269,9 +1297,9 @@ disassemble_bytes (info, disassemble_fn, insns, data,
            }
          else
            {
-             aux->require_sec = true;
+             aux->require_sec = TRUE;
              objdump_print_address (section->vma + addr_offset, info);
-             aux->require_sec = false;
+             aux->require_sec = FALSE;
              putchar (' ');
            }
 
@@ -1430,7 +1458,7 @@ disassemble_bytes (info, disassemble_fn, insns, data,
          if (!wide_output)
            putchar ('\n');
          else
-           need_nl = true;
+           need_nl = TRUE;
        }
 
       if ((section->flags & SEC_RELOC) != 0
@@ -1457,7 +1485,7 @@ disassemble_bytes (info, disassemble_fn, insns, data,
              else
                printf ("\t\t\t");
 
-             objdump_print_value (section->vma + q->address, info, true);
+             objdump_print_value (section->vma + q->address, info, TRUE);
 
              printf (": %s\t", q->howto->name);
 
@@ -1485,11 +1513,11 @@ disassemble_bytes (info, disassemble_fn, insns, data,
              if (q->addend)
                {
                  printf ("+0x");
-                 objdump_print_value (q->addend, info, true);
+                 objdump_print_value (q->addend, info, TRUE);
                }
 
              printf ("\n");
-             need_nl = false;
+             need_nl = FALSE;
              ++(*relppp);
            }
        }
@@ -1525,23 +1553,24 @@ disassemble_data (abfd)
 
   sorted_symcount = remove_useless_symbols (sorted_syms, symcount);
 
-  /* Sort the symbols into section and symbol order */
+  /* Sort the symbols into section and symbol order */
   qsort (sorted_syms, sorted_symcount, sizeof (asymbol *), compare_symbols);
 
-  INIT_DISASSEMBLE_INFO(disasm_info, stdout, fprintf);
+  INIT_DISASSEMBLE_INFO (disasm_info, stdout, fprintf);
+
   disasm_info.application_data = (PTR) &aux;
   aux.abfd = abfd;
-  aux.require_sec = false;
+  aux.require_sec = FALSE;
   disasm_info.print_address_func = objdump_print_address;
   disasm_info.symbol_at_address_func = objdump_symbol_at_address;
 
   if (machine != (char *) NULL)
     {
       const bfd_arch_info_type *info = bfd_scan_arch (machine);
+
       if (info == NULL)
-       {
-         fatal (_("Can't use supplied machine %s"), machine);
-       }
+       fatal (_("Can't use supplied machine %s"), machine);
+
       abfd->arch_info = info;
     }
 
@@ -1632,11 +1661,9 @@ disassemble_data (abfd)
              /* Skip over the relocs belonging to addresses below the
                 start address.  */
              if (start_address != (bfd_vma) -1)
-               {
-                 while (relpp < relppend
-                        && (*relpp)->address < start_address)
-                   ++relpp;
-               }
+               while (relpp < relppend
+                      && (*relpp)->address < start_address)
+                 ++relpp;
            }
        }
 
@@ -1655,11 +1682,13 @@ disassemble_data (abfd)
       disasm_info.buffer_vma = section->vma;
       disasm_info.buffer_length = datasize;
       disasm_info.section = section;
+
       if (start_address == (bfd_vma) -1
          || start_address < disasm_info.buffer_vma)
        addr_offset = 0;
       else
        addr_offset = start_address - disasm_info.buffer_vma;
+
       if (stop_address == (bfd_vma) -1)
        stop_offset = datasize / opb;
       else
@@ -1673,13 +1702,13 @@ disassemble_data (abfd)
        }
 
       sym = find_symbol_for_address (abfd, section, section->vma + addr_offset,
-                                    true, &place);
+                                    TRUE, &place);
 
       while (addr_offset < stop_offset)
        {
          asymbol *nextsym;
          unsigned long nextstop_offset;
-         boolean insns;
+         bfd_boolean insns;
 
          if (sym != NULL && bfd_asymbol_value (sym) <= section->vma + addr_offset)
            {
@@ -1690,6 +1719,7 @@ disassemble_data (abfd)
                    && bfd_asymbol_value (sorted_syms[x]) <= section->vma + addr_offset);
                   ++x)
                continue;
+
              disasm_info.symbols = & sorted_syms[place];
              disasm_info.num_symbols = x - place;
            }
@@ -1698,12 +1728,12 @@ disassemble_data (abfd)
 
          if (! prefix_addresses)
            {
-             printf ("\n");
+             (* disasm_info.fprintf_func) (disasm_info.stream, "\n");
              objdump_print_addr_with_sym (abfd, section, sym,
                                           section->vma + addr_offset,
                                           &disasm_info,
-                                          false);
-             printf (":\n");
+                                          FALSE);
+             (* disasm_info.fprintf_func) (disasm_info.stream, ":\n");
            }
 
          if (sym != NULL && bfd_asymbol_value (sym) > section->vma + addr_offset)
@@ -1754,9 +1784,9 @@ disassemble_data (abfd)
                  && (strstr (bfd_asymbol_name (sym), "gcc2_compiled")
                      == NULL))
              || (sym->flags & BSF_FUNCTION) != 0)
-           insns = true;
+           insns = TRUE;
          else
-           insns = false;
+           insns = FALSE;
 
          disassemble_bytes (&disasm_info, disassemble_fn, insns, data,
                             addr_offset, nextstop_offset, &relpp, relppend);
@@ -1766,20 +1796,13 @@ disassemble_data (abfd)
        }
 
       free (data);
+
       if (relbuf != NULL)
        free (relbuf);
     }
   free (sorted_syms);
 }
 \f
-
-/* Define a table of stab values and print-strings.  We wish the initializer
-   could be a direct-mapped table, but instead we build one the first
-   time we need it.  */
-
-static void dump_section_stabs PARAMS ((bfd *abfd, char *stabsect_name,
-                                       char *strsect_name));
-
 /* Dump the stabs sections from an object file that has a section that
    uses Sun stabs encoding.  */
 
@@ -1793,18 +1816,12 @@ dump_stabs (abfd)
   dump_section_stabs (abfd, "$GDB_SYMBOLS$", "$GDB_STRINGS$");
 }
 
-static bfd_byte *stabs;
-static bfd_size_type stab_size;
-
-static char *strtab;
-static bfd_size_type stabstr_size;
-
 /* Read ABFD's stabs section STABSECT_NAME into `stabs'
    and string table section STRSECT_NAME into `strtab'.
-   If the section exists and was read, allocate the space and return true.
-   Otherwise return false.  */
+   If the section exists and was read, allocate the space and return TRUE.
+   Otherwise return FALSE.  */
 
-static boolean
+static bfd_boolean
 read_section_stabs (abfd, stabsect_name, strsect_name)
      bfd *abfd;
      const char *stabsect_name;
@@ -1816,7 +1833,7 @@ read_section_stabs (abfd, stabsect_name, strsect_name)
   if (0 == stabsect)
     {
       printf (_("No %s section present\n\n"), stabsect_name);
-      return false;
+      return FALSE;
     }
 
   stabstrsect = bfd_get_section_by_name (abfd, strsect_name);
@@ -1825,7 +1842,7 @@ read_section_stabs (abfd, stabsect_name, strsect_name)
       non_fatal (_("%s has no %s section"),
                 bfd_get_filename (abfd), strsect_name);
       exit_status = 1;
-      return false;
+      return FALSE;
     }
 
   stab_size    = bfd_section_size (abfd, stabsect);
@@ -1842,7 +1859,7 @@ read_section_stabs (abfd, stabsect_name, strsect_name)
       free (stabs);
       free (strtab);
       exit_status = 1;
-      return false;
+      return FALSE;
     }
 
   if (! bfd_get_section_contents (abfd, stabstrsect, (PTR) strtab, 0,
@@ -1854,10 +1871,10 @@ read_section_stabs (abfd, stabsect_name, strsect_name)
       free (stabs);
       free (strtab);
       exit_status = 1;
-      return false;
+      return FALSE;
     }
 
-  return true;
+  return TRUE;
 }
 
 /* Stabs entries use a 12 byte format:
@@ -1898,7 +1915,6 @@ print_section_stabs (abfd, stabsect_name, strsect_name)
 
      We start the index at -1 because there is a dummy symbol on
      the front of stabs-in-{coff,elf} sections that supplies sizes.  */
-
   for (i = -1; stabp < stabs_end; stabp += STABSIZE, i++)
     {
       const char *name;
@@ -1930,7 +1946,6 @@ print_section_stabs (abfd, stabsect_name, strsect_name)
       /* Symbols with type == 0 (N_UNDF) specify the length of the
         string table associated with this file.  We use that info
         to know how to relocate the *next* file's string table indices.  */
-
       if (type == N_UNDF)
        {
          file_string_table_offset = next_file_string_table_offset;
@@ -1940,7 +1955,6 @@ print_section_stabs (abfd, stabsect_name, strsect_name)
        {
          /* Using the (possibly updated) string table offset, print the
             string (if any) associated with this symbol.  */
-
          if ((strx + file_string_table_offset) < stabstr_size)
            printf (" %s", &strtab[strx + file_string_table_offset]);
          else
@@ -1984,6 +1998,7 @@ dump_section_stabs (abfd, stabsect_name, strsect_name)
        }
     }
 }
+
 \f
 static void
 dump_bfd_header (abfd)
@@ -2007,10 +2022,12 @@ dump_bfd_header (abfd)
   PF (WP_TEXT, "WP_TEXT");
   PF (D_PAGED, "D_PAGED");
   PF (BFD_IS_RELAXABLE, "BFD_IS_RELAXABLE");
+  PF (HAS_LOAD_PAGE, "HAS_LOAD_PAGE");
   printf (_("\nstart address 0x"));
   bfd_printf_vma (abfd, abfd->start_address);
   printf ("\n");
 }
+
 \f
 static void
 dump_bfd_private_header (abfd)
@@ -2019,7 +2036,7 @@ bfd *abfd;
   bfd_print_private_bfd_data (abfd, stdout);
 }
 
-/* Dump selected contents of ABFD */
+/* Dump selected contents of ABFD */
 
 static void
 dump_bfd (abfd)
@@ -2042,7 +2059,7 @@ dump_bfd (abfd)
   printf (_("\n%s:     file format %s\n"), bfd_get_filename (abfd),
          abfd->xvec->name);
   if (dump_ar_hdrs)
-    print_arelt_descr (stdout, abfd, true);
+    print_arelt_descr (stdout, abfd, TRUE);
   if (dump_file_header)
     dump_bfd_header (abfd);
   if (dump_private_headers)
@@ -2050,18 +2067,16 @@ dump_bfd (abfd)
   putchar ('\n');
   if (dump_section_headers)
     dump_headers (abfd);
+
   if (dump_symtab || dump_reloc_info || disassemble || dump_debugging)
-    {
-      syms = slurp_symtab (abfd);
-    }
+    syms = slurp_symtab (abfd);
   if (dump_dynamic_symtab || dump_dynamic_reloc_info)
-    {
-      dynsyms = slurp_dynamic_symtab (abfd);
-    }
+    dynsyms = slurp_dynamic_symtab (abfd);
+
   if (dump_symtab)
-    dump_symbols (abfd, false);
+    dump_symbols (abfd, FALSE);
   if (dump_dynamic_symtab)
-    dump_symbols (abfd, true);
+    dump_symbols (abfd, TRUE);
   if (dump_stab_section_info)
     dump_stabs (abfd);
   if (dump_reloc_info && ! disassemble)
@@ -2087,11 +2102,13 @@ dump_bfd (abfd)
            }
        }
     }
+
   if (syms)
     {
       free (syms);
       syms = NULL;
     }
+
   if (dynsyms)
     {
       free (dynsyms);
@@ -2154,7 +2171,7 @@ display_file (filename, target)
       return;
     }
 
-  if (bfd_check_format (file, bfd_archive) == true)
+  if (bfd_check_format (file, bfd_archive))
     {
       bfd *last_arfile = NULL;
 
@@ -2187,7 +2204,7 @@ display_file (filename, target)
   bfd_close (file);
 }
 \f
-/* Actually display the various requested regions */
+/* Actually display the various requested regions */
 
 static void
 dump_data (abfd)
@@ -2210,6 +2227,9 @@ dump_data (abfd)
        {
          if (section->flags & SEC_HAS_CONTENTS)
            {
+             char buf[64];
+             int count, width;
+             
              printf (_("Contents of section %s:\n"), section->name);
 
              if (bfd_section_size (abfd, section) == 0)
@@ -2236,13 +2256,47 @@ dump_data (abfd)
                  if (stop_offset > bfd_section_size (abfd, section) / opb)
                    stop_offset = bfd_section_size (abfd, section) / opb;
                }
+
+             width = 4;
+
+             bfd_sprintf_vma (abfd, buf, start_offset + section->vma);
+             if (strlen (buf) >= sizeof (buf))
+               abort ();
+             count = 0;
+             while (buf[count] == '0' && buf[count+1] != '\0')
+               count++;
+             count = strlen (buf) - count;
+             if (count > width)
+               width = count;
+
+             bfd_sprintf_vma (abfd, buf, stop_offset + section->vma - 1);
+             if (strlen (buf) >= sizeof (buf))
+               abort ();
+             count = 0;
+             while (buf[count] == '0' && buf[count+1] != '\0')
+               count++;
+             count = strlen (buf) - count;
+             if (count > width)
+               width = count;
+
              for (addr_offset = start_offset;
-                  addr_offset < stop_offset; addr_offset += onaline)
+                  addr_offset < stop_offset; addr_offset += onaline / opb)
                {
                  bfd_size_type j;
 
-                 printf (" %04lx ", (unsigned long int)
-                         (addr_offset + section->vma));
+                 bfd_sprintf_vma (abfd, buf, (addr_offset + section->vma));
+                 count = strlen (buf);
+                 if (count >= sizeof (buf))
+                   abort ();
+                 putchar (' ');
+                 while (count < width)
+                   {
+                     putchar ('0');
+                     count++;
+                   }
+                 fputs (buf + count - width, stdout);
+                 putchar (' ');
+
                  for (j = addr_offset * opb;
                       j < addr_offset * opb + onaline; j++)
                    {
@@ -2255,7 +2309,8 @@ dump_data (abfd)
                    }
 
                  printf (" ");
-                 for (j = addr_offset; j < addr_offset * opb + onaline; j++)
+                 for (j = addr_offset * opb;
+                      j < addr_offset * opb + onaline; j++)
                    {
                      if (j >= stop_offset * opb)
                        printf (" ");
@@ -2270,11 +2325,12 @@ dump_data (abfd)
     }
 }
 
-/* Should perhaps share code and display with nm? */
+/* Should perhaps share code and display with nm?  */
+
 static void
 dump_symbols (abfd, dynamic)
      bfd *abfd ATTRIBUTE_UNUSED;
-     boolean dynamic;
+     bfd_boolean dynamic;
 {
   asymbol **current;
   long max;
@@ -2284,19 +2340,18 @@ dump_symbols (abfd, dynamic)
     {
       current = dynsyms;
       max = dynsymcount;
-      if (max == 0)
-       return;
       printf ("DYNAMIC SYMBOL TABLE:\n");
     }
   else
     {
       current = syms;
       max = symcount;
-      if (max == 0)
-       return;
       printf ("SYMBOL TABLE:\n");
     }
 
+  if (max == 0)
+    printf (_("no symbols\n"));
+
   for (count = 0; count < max; count++)
     {
       if (*current)
@@ -2315,7 +2370,6 @@ dump_symbols (abfd, dynamic)
                  /* If we want to demangle the name, we demangle it
                      here, and temporarily clobber it while calling
                      bfd_print_symbol.  FIXME: This is a gross hack.  */
-
                  alloc = demangle (cur_bfd, name);
                  (*current)->name = alloc;
                }
@@ -2377,12 +2431,11 @@ dump_relocs (abfd)
        {
          relpp = (arelent **) xmalloc (relsize);
          relcount = bfd_canonicalize_reloc (abfd, a, relpp, syms);
+
          if (relcount < 0)
            bfd_fatal (bfd_get_filename (abfd));
          else if (relcount == 0)
-           {
-             printf (" (none)\n\n");
-           }
+           printf (" (none)\n\n");
          else
            {
              printf ("\n");
@@ -2409,19 +2462,16 @@ dump_dynamic_relocs (abfd)
   printf ("DYNAMIC RELOCATION RECORDS");
 
   if (relsize == 0)
-    {
-      printf (" (none)\n\n");
-    }
+    printf (" (none)\n\n");
   else
     {
       relpp = (arelent **) xmalloc (relsize);
       relcount = bfd_canonicalize_dynamic_reloc (abfd, relpp, dynsyms);
+
       if (relcount < 0)
        bfd_fatal (bfd_get_filename (abfd));
       else if (relcount == 0)
-       {
-         printf (" (none)\n\n");
-       }
+       printf (" (none)\n\n");
       else
        {
          printf ("\n");
@@ -2446,6 +2496,7 @@ dump_reloc_set (abfd, sec, relpp, relcount)
   /* Get column headers lined up reasonably.  */
   {
     static int width;
+
     if (width == 0)
       {
        char buf[30];
@@ -2488,6 +2539,7 @@ dump_reloc_set (abfd, sec, relpp, relcount)
                free (last_functionname);
              last_functionname = xstrdup (functionname);
            }
+
          if (line > 0
              && (line != last_line
                  || (filename != NULL
@@ -2515,6 +2567,7 @@ dump_reloc_set (abfd, sec, relpp, relcount)
          sym_name = NULL;
          section_name = NULL;
        }
+
       if (sym_name)
        {
          bfd_printf_vma (abfd, q->address);
@@ -2534,192 +2587,17 @@ dump_reloc_set (abfd, sec, relpp, relcount)
                  q->howto->name,
                  section_name);
        }
+
       if (q->addend)
        {
          printf ("+0x");
          bfd_printf_vma (abfd, q->addend);
        }
+
       printf ("\n");
     }
 }
 \f
-/* The length of the longest architecture name + 1.  */
-#define LONGEST_ARCH sizeof("powerpc:common")
-
-static const char *
-endian_string (endian)
-     enum bfd_endian endian;
-{
-  if (endian == BFD_ENDIAN_BIG)
-    return "big endian";
-  else if (endian == BFD_ENDIAN_LITTLE)
-    return "little endian";
-  else
-    return "endianness unknown";
-}
-
-/* List the targets that BFD is configured to support, each followed
-   by its endianness and the architectures it supports.  */
-
-static void
-display_target_list ()
-{
-  extern const bfd_target *const *bfd_target_vector;
-  char *dummy_name;
-  int t;
-
-  dummy_name = make_temp_file (NULL);
-  for (t = 0; bfd_target_vector[t]; t++)
-    {
-      const bfd_target *p = bfd_target_vector[t];
-      bfd *abfd = bfd_openw (dummy_name, p->name);
-      int a;
-
-      printf ("%s\n (header %s, data %s)\n", p->name,
-             endian_string (p->header_byteorder),
-             endian_string (p->byteorder));
-
-      if (abfd == NULL)
-       {
-         nonfatal (dummy_name);
-         continue;
-       }
-
-      if (! bfd_set_format (abfd, bfd_object))
-       {
-         if (bfd_get_error () != bfd_error_invalid_operation)
-           nonfatal (p->name);
-         bfd_close_all_done (abfd);
-         continue;
-       }
-
-      for (a = (int) bfd_arch_obscure + 1; a < (int) bfd_arch_last; a++)
-       if (bfd_set_arch_mach (abfd, (enum bfd_architecture) a, 0))
-         printf ("  %s\n",
-                 bfd_printable_arch_mach ((enum bfd_architecture) a, 0));
-      bfd_close_all_done (abfd);
-    }
-  unlink (dummy_name);
-  free (dummy_name);
-}
-
-/* Print a table showing which architectures are supported for entries
-   FIRST through LAST-1 of bfd_target_vector (targets across,
-   architectures down).  */
-
-static void
-display_info_table (first, last)
-     int first;
-     int last;
-{
-  extern const bfd_target *const *bfd_target_vector;
-  int t, a;
-  char *dummy_name;
-
-  /* Print heading of target names.  */
-  printf ("\n%*s", (int) LONGEST_ARCH, " ");
-  for (t = first; t < last && bfd_target_vector[t]; t++)
-    printf ("%s ", bfd_target_vector[t]->name);
-  putchar ('\n');
-
-  dummy_name = make_temp_file (NULL);
-  for (a = (int) bfd_arch_obscure + 1; a < (int) bfd_arch_last; a++)
-    if (strcmp (bfd_printable_arch_mach (a, 0), "UNKNOWN!") != 0)
-      {
-       printf ("%*s ", (int) LONGEST_ARCH - 1,
-               bfd_printable_arch_mach (a, 0));
-       for (t = first; t < last && bfd_target_vector[t]; t++)
-         {
-           const bfd_target *p = bfd_target_vector[t];
-           boolean ok = true;
-           bfd *abfd = bfd_openw (dummy_name, p->name);
-
-           if (abfd == NULL)
-             {
-               nonfatal (p->name);
-               ok = false;
-             }
-
-           if (ok)
-             {
-               if (! bfd_set_format (abfd, bfd_object))
-                 {
-                   if (bfd_get_error () != bfd_error_invalid_operation)
-                     nonfatal (p->name);
-                   ok = false;
-                 }
-             }
-
-           if (ok)
-             {
-               if (! bfd_set_arch_mach (abfd, a, 0))
-                 ok = false;
-             }
-
-           if (ok)
-             printf ("%s ", p->name);
-           else
-             {
-               int l = strlen (p->name);
-               while (l--)
-                 putchar ('-');
-               putchar (' ');
-             }
-           if (abfd != NULL)
-             bfd_close_all_done (abfd);
-         }
-       putchar ('\n');
-      }
-  unlink (dummy_name);
-  free (dummy_name);
-}
-
-/* Print tables of all the target-architecture combinations that
-   BFD has been configured to support.  */
-
-static void
-display_target_tables ()
-{
-  int t, columns;
-  extern const bfd_target *const *bfd_target_vector;
-  char *colum;
-
-  columns = 0;
-  colum = getenv ("COLUMNS");
-  if (colum != NULL)
-    columns = atoi (colum);
-  if (columns == 0)
-    columns = 80;
-
-  t = 0;
-  while (bfd_target_vector[t] != NULL)
-    {
-      int oldt = t, wid;
-
-      wid = LONGEST_ARCH + strlen (bfd_target_vector[t]->name) + 1;
-      ++t;
-      while (wid < columns && bfd_target_vector[t] != NULL)
-       {
-         int newwid;
-
-         newwid = wid + strlen (bfd_target_vector[t]->name) + 1;
-         if (newwid >= columns)
-           break;
-         wid = newwid;
-         ++t;
-       }
-      display_info_table (oldt, t);
-    }
-}
-
-static void
-display_info ()
-{
-  printf (_("BFD header file version %s\n"), BFD_VERSION_STRING);
-  display_target_list ();
-  display_target_tables ();
-}
-
 int main PARAMS ((int, char **));
 
 int
@@ -2729,7 +2607,7 @@ main (argc, argv)
 {
   int c;
   char *target = default_target;
-  boolean seenflag = false;
+  bfd_boolean seenflag = FALSE;
 
 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
   setlocale (LC_MESSAGES, "");
@@ -2766,13 +2644,13 @@ main (argc, argv)
          only = optarg;
          break;
        case 'l':
-         with_line_numbers = true;
+         with_line_numbers = TRUE;
          break;
        case 'b':
          target = optarg;
          break;
        case 'C':
-         do_demangle = true;
+         do_demangle = TRUE;
          if (optarg != NULL)
            {
              enum demangling_styles style;
@@ -2786,7 +2664,7 @@ main (argc, argv)
            }
          break;
        case 'w':
-         wide_output = true;
+         wide_output = TRUE;
          break;
        case OPTION_ADJUST_VMA:
          adjust_section_vma = parse_vma (optarg, "--adjust-vma");
@@ -2821,86 +2699,86 @@ main (argc, argv)
          break;
 
        case 'f':
-         dump_file_header = true;
-         seenflag = true;
+         dump_file_header = TRUE;
+         seenflag = TRUE;
          break;
        case 'i':
-         formats_info = true;
-         seenflag = true;
+         formats_info = TRUE;
+         seenflag = TRUE;
          break;
        case 'p':
-         dump_private_headers = true;
-         seenflag = true;
+         dump_private_headers = TRUE;
+         seenflag = TRUE;
          break;
        case 'x':
-         dump_private_headers = true;
-         dump_symtab = true;
-         dump_reloc_info = true;
-         dump_file_header = true;
-         dump_ar_hdrs = true;
-         dump_section_headers = true;
-         seenflag = true;
+         dump_private_headers = TRUE;
+         dump_symtab = TRUE;
+         dump_reloc_info = TRUE;
+         dump_file_header = TRUE;
+         dump_ar_hdrs = TRUE;
+         dump_section_headers = TRUE;
+         seenflag = TRUE;
          break;
        case 't':
-         dump_symtab = true;
-         seenflag = true;
+         dump_symtab = TRUE;
+         seenflag = TRUE;
          break;
        case 'T':
-         dump_dynamic_symtab = true;
-         seenflag = true;
+         dump_dynamic_symtab = TRUE;
+         seenflag = TRUE;
          break;
        case 'd':
-         disassemble = true;
-         seenflag = true;
+         disassemble = TRUE;
+         seenflag = TRUE;
          break;
        case 'z':
-         disassemble_zeroes = true;
+         disassemble_zeroes = TRUE;
          break;
        case 'D':
-         disassemble = true;
-         disassemble_all = true;
-         seenflag = true;
+         disassemble = TRUE;
+         disassemble_all = TRUE;
+         seenflag = TRUE;
          break;
        case 'S':
-         disassemble = true;
-         with_source_code = true;
-         seenflag = true;
+         disassemble = TRUE;
+         with_source_code = TRUE;
+         seenflag = TRUE;
          break;
        case 'g':
          dump_debugging = 1;
-         seenflag = true;
+         seenflag = TRUE;
          break;
        case 'G':
-         dump_stab_section_info = true;
-         seenflag = true;
+         dump_stab_section_info = TRUE;
+         seenflag = TRUE;
          break;
        case 's':
-         dump_section_contents = true;
-         seenflag = true;
+         dump_section_contents = TRUE;
+         seenflag = TRUE;
          break;
        case 'r':
-         dump_reloc_info = true;
-         seenflag = true;
+         dump_reloc_info = TRUE;
+         seenflag = TRUE;
          break;
        case 'R':
-         dump_dynamic_reloc_info = true;
-         seenflag = true;
+         dump_dynamic_reloc_info = TRUE;
+         seenflag = TRUE;
          break;
        case 'a':
-         dump_ar_hdrs = true;
-         seenflag = true;
+         dump_ar_hdrs = TRUE;
+         seenflag = TRUE;
          break;
        case 'h':
-         dump_section_headers = true;
-         seenflag = true;
+         dump_section_headers = TRUE;
+         seenflag = TRUE;
          break;
        case 'H':
          usage (stdout, 0);
-         seenflag = true;
+         seenflag = TRUE;
        case 'v':
        case 'V':
-         show_version = true;
-         seenflag = true;
+         show_version = TRUE;
+         seenflag = TRUE;
          break;
 
        default:
@@ -2911,11 +2789,11 @@ main (argc, argv)
   if (show_version)
     print_version ("objdump");
 
-  if (seenflag == false)
+  if (!seenflag)
     usage (stderr, 2);
 
   if (formats_info)
-    display_info ();
+    exit_status = display_info ();
   else
     {
       if (optind == argc)