Add support for reading Aarch64 core dumps.
[binutils-gdb.git] / binutils / nm.c
index c1fb4d803e845e1f3de510f813dd99b393d31130..2a44a846004885f06f288af6c38fa42eddf5a7f2 100644 (file)
@@ -1,13 +1,11 @@
 /* nm.c -- Describe symbol table of a rel file.
 /* nm.c -- Describe symbol table of a rel file.
-   Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
-   2001, 2002, 2003, 2004, 2005
-   Free Software Foundation, Inc.
+   Copyright (C) 1991-2014 Free Software Foundation, Inc.
 
    This file is part of GNU Binutils.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
 
    This file is part of GNU Binutils.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
    02110-1301, USA.  */
 
    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
    02110-1301, USA.  */
 
+#include "sysdep.h"
 #include "bfd.h"
 #include "progress.h"
 #include "bfd.h"
 #include "progress.h"
-#include "bucomm.h"
-#include "budemang.h"
 #include "getopt.h"
 #include "aout/stab_gnu.h"
 #include "aout/ranlib.h"
 #include "getopt.h"
 #include "aout/stab_gnu.h"
 #include "aout/ranlib.h"
@@ -31,6 +28,8 @@
 #include "libiberty.h"
 #include "elf-bfd.h"
 #include "elf/common.h"
 #include "libiberty.h"
 #include "elf-bfd.h"
 #include "elf/common.h"
+#include "bucomm.h"
+#include "plugin.h"
 
 /* When sorting by size, we use this structure to hold the size and a
    pointer to the minisymbol.  */
 
 /* When sorting by size, we use this structure to hold the size and a
    pointer to the minisymbol.  */
@@ -159,32 +158,36 @@ static int filename_per_file = 0; /* Once per file, on its own line.  */
 static int filename_per_symbol = 0;    /* Once per symbol, at start of line.  */
 
 /* Print formats for printing a symbol value.  */
 static int filename_per_symbol = 0;    /* Once per symbol, at start of line.  */
 
 /* Print formats for printing a symbol value.  */
-#ifndef BFD64
-static char value_format[] = "%08lx";
-#else
+static char value_format_32bit[] = "%08lx";
 #if BFD_HOST_64BIT_LONG
 #if BFD_HOST_64BIT_LONG
-static char value_format[] = "%016lx";
+static char value_format_64bit[] = "%016lx";
+#elif BFD_HOST_64BIT_LONG_LONG
+#ifndef __MSVCRT__
+static char value_format_64bit[] = "%016llx";
 #else
 #else
-/* We don't use value_format for this case.  */
-#endif
+static char value_format_64bit[] = "%016I64x";
 #endif
 #endif
-#ifdef BFD64
-static int print_width = 16;
-#else
-static int print_width = 8;
 #endif
 #endif
+static int print_width = 0;
 static int print_radix = 16;
 /* Print formats for printing stab info.  */
 static char other_format[] = "%02x";
 static char desc_format[] = "%04x";
 
 static char *target = NULL;
 static int print_radix = 16;
 /* Print formats for printing stab info.  */
 static char other_format[] = "%02x";
 static char desc_format[] = "%04x";
 
 static char *target = NULL;
+#if BFD_SUPPORTS_PLUGINS
+static const char *plugin_target = "plugin";
+#else
+static const char *plugin_target = NULL;
+#endif
 
 /* Used to cache the line numbers for a BFD.  */
 static bfd *lineno_cache_bfd;
 static bfd *lineno_cache_rel_bfd;
 
 #define OPTION_TARGET 200
 
 /* Used to cache the line numbers for a BFD.  */
 static bfd *lineno_cache_bfd;
 static bfd *lineno_cache_rel_bfd;
 
 #define OPTION_TARGET 200
+#define OPTION_PLUGIN (OPTION_TARGET + 1)
+#define OPTION_SIZE_SORT (OPTION_PLUGIN + 1)
 
 static struct option long_options[] =
 {
 
 static struct option long_options[] =
 {
@@ -197,15 +200,16 @@ static struct option long_options[] =
   {"line-numbers", no_argument, 0, 'l'},
   {"no-cplus", no_argument, &do_demangle, 0},  /* Linux compatibility.  */
   {"no-demangle", no_argument, &do_demangle, 0},
   {"line-numbers", no_argument, 0, 'l'},
   {"no-cplus", no_argument, &do_demangle, 0},  /* Linux compatibility.  */
   {"no-demangle", no_argument, &do_demangle, 0},
-  {"no-sort", no_argument, &no_sort, 1},
-  {"numeric-sort", no_argument, &sort_numerically, 1},
+  {"no-sort", no_argument, 0, 'p'},
+  {"numeric-sort", no_argument, 0, 'n'},
+  {"plugin", required_argument, 0, OPTION_PLUGIN},
   {"portability", no_argument, 0, 'P'},
   {"print-armap", no_argument, &print_armap, 1},
   {"print-file-name", no_argument, 0, 'o'},
   {"print-size", no_argument, 0, 'S'},
   {"radix", required_argument, 0, 't'},
   {"reverse-sort", no_argument, &reverse_sort, 1},
   {"portability", no_argument, 0, 'P'},
   {"print-armap", no_argument, &print_armap, 1},
   {"print-file-name", no_argument, 0, 'o'},
   {"print-size", no_argument, 0, 'S'},
   {"radix", required_argument, 0, 't'},
   {"reverse-sort", no_argument, &reverse_sort, 1},
-  {"size-sort", no_argument, &sort_by_size, 1},
+  {"size-sort", no_argument, 0, OPTION_SIZE_SORT},
   {"special-syms", no_argument, &allow_special_symbols, 1},
   {"stats", no_argument, &show_stats, 1},
   {"synthetic", no_argument, &show_synthetic, 1},
   {"special-syms", no_argument, &allow_special_symbols, 1},
   {"stats", no_argument, &show_stats, 1},
   {"synthetic", no_argument, &show_synthetic, 1},
@@ -244,7 +248,12 @@ usage (FILE *stream, int status)
   -o                     Same as -A\n\
   -p, --no-sort          Do not sort the symbols\n\
   -P, --portability      Same as --format=posix\n\
   -o                     Same as -A\n\
   -p, --no-sort          Do not sort the symbols\n\
   -P, --portability      Same as --format=posix\n\
-  -r, --reverse-sort     Reverse the sense of the sort\n\
+  -r, --reverse-sort     Reverse the sense of the sort\n"));
+#if BFD_SUPPORTS_PLUGINS
+  fprintf (stream, _("\
+      --plugin NAME      Load the specified plugin\n"));
+#endif
+  fprintf (stream, _("\
   -S, --print-size       Print size of defined symbols\n\
   -s, --print-armap      Include index for symbols from archive members\n\
       --size-sort        Sort symbols by size\n\
   -S, --print-size       Print size of defined symbols\n\
   -s, --print-armap      Include index for symbols from archive members\n\
       --size-sort        Sort symbols by size\n\
@@ -259,7 +268,7 @@ usage (FILE *stream, int status)
   -V, --version          Display this program's version number\n\
 \n"));
   list_supported_targets (program_name, stream);
   -V, --version          Display this program's version number\n\
 \n"));
   list_supported_targets (program_name, stream);
-  if (status == 0)
+  if (REPORT_BUGS_TO[0] && status == 0)
     fprintf (stream, _("Report bugs to %s.\n"), REPORT_BUGS_TO);
   exit (status);
 }
     fprintf (stream, _("Report bugs to %s.\n"), REPORT_BUGS_TO);
   exit (status);
 }
@@ -279,14 +288,14 @@ set_print_radix (char *radix)
        print_radix = 10;
       else
        print_radix = 8;
        print_radix = 10;
       else
        print_radix = 8;
-#ifndef BFD64
-      value_format[4] = *radix;
-#else
+      value_format_32bit[4] = *radix;
 #if BFD_HOST_64BIT_LONG
 #if BFD_HOST_64BIT_LONG
-      value_format[5] = *radix;
+      value_format_64bit[5] = *radix;
+#elif BFD_HOST_64BIT_LONG_LONG
+#ifndef __MSVCRT__
+      value_format_64bit[6] = *radix;
 #else
 #else
-      /* This case requires special handling for octal and decimal
-         printing.  */
+      value_format_64bit[7] = *radix;
 #endif
 #endif
       other_format[3] = desc_format[3] = *radix;
 #endif
 #endif
       other_format[3] = desc_format[3] = *radix;
@@ -346,22 +355,25 @@ get_symbol_type (unsigned int type)
     }
 }
 \f
     }
 }
 \f
-/* Print symbol name NAME, read from ABFD, with printf format FORMAT,
+/* Print symbol name NAME, read from ABFD, with printf format FORM,
    demangling it if requested.  */
 
 static void
    demangling it if requested.  */
 
 static void
-print_symname (const char *format, const char *name, bfd *abfd)
+print_symname (const char *form, const char *name, bfd *abfd)
 {
   if (do_demangle && *name)
     {
 {
   if (do_demangle && *name)
     {
-      char *res = demangle (abfd, name);
+      char *res = bfd_demangle (abfd, name, DMGL_ANSI | DMGL_PARAMS);
 
 
-      printf (format, res);
-      free (res);
-      return;
+      if (res != NULL)
+       {
+         printf (form, res);
+         free (res);
+         return;
+       }
     }
 
     }
 
-  printf (format, name);
+  printf (form, name);
 }
 
 static void
 }
 
 static void
@@ -397,7 +409,7 @@ print_symdef_entry (bfd *abfd)
    Return the number of symbols to be printed.  */
 
 static long
    Return the number of symbols to be printed.  */
 
 static long
-filter_symbols (bfd *abfd, bfd_boolean dynamic, void *minisyms,
+filter_symbols (bfd *abfd, bfd_boolean is_dynamic, void *minisyms,
                long symcount, unsigned int size)
 {
   bfd_byte *from, *fromend, *to;
                long symcount, unsigned int size)
 {
   bfd_byte *from, *fromend, *to;
@@ -418,15 +430,17 @@ filter_symbols (bfd *abfd, bfd_boolean dynamic, void *minisyms,
 
       PROGRESS (1);
 
 
       PROGRESS (1);
 
-      sym = bfd_minisymbol_to_symbol (abfd, dynamic, (const void *) from, store);
+      sym = bfd_minisymbol_to_symbol (abfd, is_dynamic, (const void *) from, store);
       if (sym == NULL)
        bfd_fatal (bfd_get_filename (abfd));
 
       if (undefined_only)
        keep = bfd_is_und_section (sym->section);
       else if (external_only)
       if (sym == NULL)
        bfd_fatal (bfd_get_filename (abfd));
 
       if (undefined_only)
        keep = bfd_is_und_section (sym->section);
       else if (external_only)
-       keep = ((sym->flags & BSF_GLOBAL) != 0
-               || (sym->flags & BSF_WEAK) != 0
+       /* PR binutls/12753: Unique symbols are global too.  */
+       keep = ((sym->flags & (BSF_GLOBAL
+                              | BSF_WEAK
+                              | BSF_GNU_UNIQUE)) != 0
                || bfd_is_und_section (sym->section)
                || bfd_is_com_section (sym->section));
       else
                || bfd_is_und_section (sym->section)
                || bfd_is_com_section (sym->section));
       else
@@ -457,7 +471,8 @@ filter_symbols (bfd *abfd, bfd_boolean dynamic, void *minisyms,
 
       if (keep)
        {
 
       if (keep)
        {
-         memcpy (to, from, size);
+         if (to != from)
+           memcpy (to, from, size);
          to += size;
        }
     }
          to += size;
        }
     }
@@ -658,7 +673,7 @@ size_forward2 (const void *P_x, const void *P_y)
    size.  */
 
 static long
    size.  */
 
 static long
-sort_symbols_by_size (bfd *abfd, bfd_boolean dynamic, void *minisyms,
+sort_symbols_by_size (bfd *abfd, bfd_boolean is_dynamic, void *minisyms,
                      long symcount, unsigned int size,
                      struct size_sym **symsizesp)
 {
                      long symcount, unsigned int size,
                      struct size_sym **symsizesp)
 {
@@ -671,7 +686,7 @@ sort_symbols_by_size (bfd *abfd, bfd_boolean dynamic, void *minisyms,
 
   /* We are going to return a special set of symbols and sizes to
      print.  */
 
   /* We are going to return a special set of symbols and sizes to
      print.  */
-  symsizes = xmalloc (symcount * sizeof (struct size_sym));
+  symsizes = (struct size_sym *) xmalloc (symcount * sizeof (struct size_sym));
   *symsizesp = symsizes;
 
   /* Note that filter_symbols has already removed all absolute and
   *symsizesp = symsizes;
 
   /* Note that filter_symbols has already removed all absolute and
@@ -685,7 +700,7 @@ sort_symbols_by_size (bfd *abfd, bfd_boolean dynamic, void *minisyms,
 
   if (from < fromend)
     {
 
   if (from < fromend)
     {
-      sym = bfd_minisymbol_to_symbol (abfd, dynamic, (const void *) from,
+      sym = bfd_minisymbol_to_symbol (abfd, is_dynamic, (const void *) from,
                                      store_sym);
       if (sym == NULL)
        bfd_fatal (bfd_get_filename (abfd));
                                      store_sym);
       if (sym == NULL)
        bfd_fatal (bfd_get_filename (abfd));
@@ -701,7 +716,7 @@ sort_symbols_by_size (bfd *abfd, bfd_boolean dynamic, void *minisyms,
       if (from + size < fromend)
        {
          next = bfd_minisymbol_to_symbol (abfd,
       if (from + size < fromend)
        {
          next = bfd_minisymbol_to_symbol (abfd,
-                                          dynamic,
+                                          is_dynamic,
                                           (const void *) (from + size),
                                           store_next);
          if (next == NULL)
                                           (const void *) (from + size),
                                           store_next);
          if (next == NULL)
@@ -772,7 +787,7 @@ get_relocs (bfd *abfd, asection *sec, void *dataarg)
       if (relsize < 0)
        bfd_fatal (bfd_get_filename (abfd));
 
       if (relsize < 0)
        bfd_fatal (bfd_get_filename (abfd));
 
-      *data->relocs = xmalloc (relsize);
+      *data->relocs = (arelent **) xmalloc (relsize);
       *data->relcount = bfd_canonicalize_reloc (abfd, sec, *data->relocs,
                                                data->syms);
       if (*data->relcount < 0)
       *data->relcount = bfd_canonicalize_reloc (abfd, sec, *data->relocs,
                                                data->syms);
       if (*data->relcount < 0)
@@ -827,7 +842,7 @@ print_symbol (bfd *abfd, asymbol *sym, bfd_vma ssize, bfd *archive_bfd)
          symsize = bfd_get_symtab_upper_bound (abfd);
          if (symsize < 0)
            bfd_fatal (bfd_get_filename (abfd));
          symsize = bfd_get_symtab_upper_bound (abfd);
          if (symsize < 0)
            bfd_fatal (bfd_get_filename (abfd));
-         syms = xmalloc (symsize);
+         syms = (asymbol **) xmalloc (symsize);
          symcount = bfd_canonicalize_symtab (abfd, syms);
          if (symcount < 0)
            bfd_fatal (bfd_get_filename (abfd));
          symcount = bfd_canonicalize_symtab (abfd, syms);
          if (symcount < 0)
            bfd_fatal (bfd_get_filename (abfd));
@@ -860,19 +875,19 @@ print_symbol (bfd *abfd, asymbol *sym, bfd_vma ssize, bfd *archive_bfd)
 
          if (relocs == NULL)
            {
 
          if (relocs == NULL)
            {
-             struct get_relocs_info info;
+             struct get_relocs_info rinfo;
 
              seccount = bfd_count_sections (abfd);
 
 
              seccount = bfd_count_sections (abfd);
 
-             secs = xmalloc (seccount * sizeof *secs);
-             relocs = xmalloc (seccount * sizeof *relocs);
-             relcount = xmalloc (seccount * sizeof *relcount);
+             secs = (asection **) xmalloc (seccount * sizeof *secs);
+             relocs = (arelent ***) xmalloc (seccount * sizeof *relocs);
+             relcount = (long *) xmalloc (seccount * sizeof *relcount);
 
 
-             info.secs = secs;
-             info.relocs = relocs;
-             info.relcount = relcount;
-             info.syms = syms;
-             bfd_map_over_sections (abfd, get_relocs, (void *) &info);
+             rinfo.secs = secs;
+             rinfo.relocs = relocs;
+             rinfo.relcount = relcount;
+             rinfo.syms = syms;
+             bfd_map_over_sections (abfd, get_relocs, (void *) &rinfo);
              lineno_cache_rel_bfd = abfd;
            }
 
              lineno_cache_rel_bfd = abfd;
            }
 
@@ -922,7 +937,7 @@ print_symbol (bfd *abfd, asymbol *sym, bfd_vma ssize, bfd *archive_bfd)
 /* Print the symbols when sorting by size.  */
 
 static void
 /* Print the symbols when sorting by size.  */
 
 static void
-print_size_symbols (bfd *abfd, bfd_boolean dynamic,
+print_size_symbols (bfd *abfd, bfd_boolean is_dynamic,
                    struct size_sym *symsizes, long symcount,
                    bfd *archive_bfd)
 {
                    struct size_sym *symsizes, long symcount,
                    bfd *archive_bfd)
 {
@@ -938,19 +953,12 @@ print_size_symbols (bfd *abfd, bfd_boolean dynamic,
   for (; from < fromend; from++)
     {
       asymbol *sym;
   for (; from < fromend; from++)
     {
       asymbol *sym;
-      bfd_vma ssize;
 
 
-      sym = bfd_minisymbol_to_symbol (abfd, dynamic, from->minisym, store);
+      sym = bfd_minisymbol_to_symbol (abfd, is_dynamic, from->minisym, store);
       if (sym == NULL)
        bfd_fatal (bfd_get_filename (abfd));
 
       if (sym == NULL)
        bfd_fatal (bfd_get_filename (abfd));
 
-      /* For elf we have already computed the correct symbol size.  */
-      if (bfd_get_flavour (abfd) == bfd_target_elf_flavour)
-       ssize = from->size;
-      else
-       ssize = from->size - bfd_section_vma (abfd, bfd_get_section (sym));
-
-      print_symbol (abfd, sym, ssize, archive_bfd);
+      print_symbol (abfd, sym, from->size, archive_bfd);
     }
 }
 
     }
 }
 
@@ -959,7 +967,7 @@ print_size_symbols (bfd *abfd, bfd_boolean dynamic,
    containing ABFD.  */
 
 static void
    containing ABFD.  */
 
 static void
-print_symbols (bfd *abfd, bfd_boolean dynamic, void *minisyms, long symcount,
+print_symbols (bfd *abfd, bfd_boolean is_dynamic, void *minisyms, long symcount,
               unsigned int size, bfd *archive_bfd)
 {
   asymbol *store;
               unsigned int size, bfd *archive_bfd)
 {
   asymbol *store;
@@ -975,7 +983,7 @@ print_symbols (bfd *abfd, bfd_boolean dynamic, void *minisyms, long symcount,
     {
       asymbol *sym;
 
     {
       asymbol *sym;
 
-      sym = bfd_minisymbol_to_symbol (abfd, dynamic, from, store);
+      sym = bfd_minisymbol_to_symbol (abfd, is_dynamic, from, store);
       if (sym == NULL)
        bfd_fatal (bfd_get_filename (abfd));
 
       if (sym == NULL)
        bfd_fatal (bfd_get_filename (abfd));
 
@@ -1004,7 +1012,15 @@ display_rel_file (bfd *abfd, bfd *archive_bfd)
 
   symcount = bfd_read_minisymbols (abfd, dynamic, &minisyms, &size);
   if (symcount < 0)
 
   symcount = bfd_read_minisymbols (abfd, dynamic, &minisyms, &size);
   if (symcount < 0)
-    bfd_fatal (bfd_get_filename (abfd));
+    {
+      if (dynamic && bfd_get_error () == bfd_error_no_symbols)
+       {
+         non_fatal (_("%s: no symbols"), bfd_get_filename (abfd));
+         return;
+       }
+
+      bfd_fatal (bfd_get_filename (abfd));
+    }
 
   if (symcount == 0)
     {
 
   if (symcount == 0)
     {
@@ -1024,18 +1040,18 @@ display_rel_file (bfd *abfd, bfd *archive_bfd)
       if (dynamic)
        {
          dyn_count = symcount;
       if (dynamic)
        {
          dyn_count = symcount;
-         dyn_syms = minisyms;
+         dyn_syms = (asymbol **) minisyms;
        }
       else
        {
          long storage = bfd_get_dynamic_symtab_upper_bound (abfd);
 
          static_count = symcount;
        }
       else
        {
          long storage = bfd_get_dynamic_symtab_upper_bound (abfd);
 
          static_count = symcount;
-         static_syms = minisyms;
+         static_syms = (asymbol **) minisyms;
 
          if (storage > 0)
            {
 
          if (storage > 0)
            {
-             dyn_syms = xmalloc (storage);
+             dyn_syms = (asymbol **) xmalloc (storage);
              dyn_count = bfd_canonicalize_dynamic_symtab (abfd, dyn_syms);
              if (dyn_count < 0)
                bfd_fatal (bfd_get_filename (abfd));
              dyn_count = bfd_canonicalize_dynamic_symtab (abfd, dyn_syms);
              if (dyn_count < 0)
                bfd_fatal (bfd_get_filename (abfd));
@@ -1050,7 +1066,7 @@ display_rel_file (bfd *abfd, bfd *archive_bfd)
          long i;
 
          new_mini = xmalloc ((symcount + synth_count + 1) * sizeof (*symp));
          long i;
 
          new_mini = xmalloc ((symcount + synth_count + 1) * sizeof (*symp));
-         symp = new_mini;
+         symp = (asymbol **) new_mini;
          memcpy (symp, minisyms, symcount * sizeof (*symp));
          symp += symcount;
          for (i = 0; i < synth_count; i++)
          memcpy (symp, minisyms, symcount * sizeof (*symp));
          symp += symcount;
          for (i = 0; i < synth_count; i++)
@@ -1091,6 +1107,27 @@ display_rel_file (bfd *abfd, bfd *archive_bfd)
     print_size_symbols (abfd, dynamic, symsizes, symcount, archive_bfd);
 
   free (minisyms);
     print_size_symbols (abfd, dynamic, symsizes, symcount, archive_bfd);
 
   free (minisyms);
+  free (symsizes);
+}
+
+static void
+set_print_width (bfd *file)
+{
+  print_width = bfd_get_arch_size (file);
+
+  if (print_width == -1)
+    {
+      /* PR binutils/4292
+        Guess the target's bitsize based on its name.
+        We assume here than any 64-bit format will include
+        "64" somewhere in its name.  The only known exception
+        is the MMO object file format.  */
+      if (strstr (bfd_get_target (file), "64") != NULL
+         || strcmp (bfd_get_target (file), "mmo") == 0)
+       print_width = 64;
+      else
+       print_width = 32;
+    }
 }
 
 static void
 }
 
 static void
@@ -1120,10 +1157,7 @@ display_archive (bfd *file)
 
       if (bfd_check_format_matches (arfile, bfd_object, &matching))
        {
 
       if (bfd_check_format_matches (arfile, bfd_object, &matching))
        {
-         char buf[30];
-
-         bfd_sprintf_vma (arfile, buf, (bfd_vma) -1);
-         print_width = strlen (buf);
+         set_print_width (arfile);
          format->print_archive_member (bfd_get_filename (file),
                                        bfd_get_filename (arfile));
          display_rel_file (arfile, file);
          format->print_archive_member (bfd_get_filename (file),
                                        bfd_get_filename (arfile));
          display_rel_file (arfile, file);
@@ -1165,23 +1199,24 @@ display_file (char *filename)
   if (get_file_size (filename) < 1)
     return FALSE;
 
   if (get_file_size (filename) < 1)
     return FALSE;
 
-  file = bfd_openr (filename, target);
+  file = bfd_openr (filename, target ? target : plugin_target);
   if (file == NULL)
     {
       bfd_nonfatal (filename);
       return FALSE;
     }
 
   if (file == NULL)
     {
       bfd_nonfatal (filename);
       return FALSE;
     }
 
+  /* If printing line numbers, decompress the debug sections.  */
+  if (line_numbers)
+    file->flags |= BFD_DECOMPRESS;
+
   if (bfd_check_format (file, bfd_archive))
     {
       display_archive (file);
     }
   else if (bfd_check_format_matches (file, bfd_object, &matching))
     {
   if (bfd_check_format (file, bfd_archive))
     {
       display_archive (file);
     }
   else if (bfd_check_format_matches (file, bfd_object, &matching))
     {
-      char buf[30];
-
-      bfd_sprintf_vma (file, buf, (bfd_vma) -1);
-      print_width = strlen (buf);
+      set_print_width (file);
       format->print_object_filename (filename);
       display_rel_file (file, NULL);
     }
       format->print_object_filename (filename);
       display_rel_file (file, NULL);
     }
@@ -1227,7 +1262,7 @@ print_object_filename_sysv (char *filename)
     printf (_("\n\nUndefined symbols from %s:\n\n"), filename);
   else
     printf (_("\n\nSymbols from %s:\n\n"), filename);
     printf (_("\n\nUndefined symbols from %s:\n\n"), filename);
   else
     printf (_("\n\nSymbols from %s:\n\n"), filename);
-  if (print_width == 8)
+  if (print_width == 32)
     printf (_("\
 Name                  Value   Class        Type         Size     Line  Section\n\n"));
   else
     printf (_("\
 Name                  Value   Class        Type         Size     Line  Section\n\n"));
   else
@@ -1278,7 +1313,7 @@ print_archive_member_sysv (char *archive, const char *filename)
     printf (_("\n\nUndefined symbols from %s[%s]:\n\n"), archive, filename);
   else
     printf (_("\n\nSymbols from %s[%s]:\n\n"), archive, filename);
     printf (_("\n\nUndefined symbols from %s[%s]:\n\n"), archive, filename);
   else
     printf (_("\n\nSymbols from %s[%s]:\n\n"), archive, filename);
-  if (print_width == 8)
+  if (print_width == 32)
     printf (_("\
 Name                  Value   Class        Type         Size     Line  Section\n\n"));
   else
     printf (_("\
 Name                  Value   Class        Type         Size     Line  Section\n\n"));
   else
@@ -1336,29 +1371,42 @@ print_symbol_filename_posix (bfd *archive_bfd, bfd *abfd)
 static void
 print_value (bfd *abfd ATTRIBUTE_UNUSED, bfd_vma val)
 {
 static void
 print_value (bfd *abfd ATTRIBUTE_UNUSED, bfd_vma val)
 {
-#if ! defined (BFD64) || BFD_HOST_64BIT_LONG
-  printf (value_format, val);
-#else
-  /* We have a 64 bit value to print, but the host is only 32 bit.  */
-  if (print_radix == 16)
-    bfd_fprintf_vma (abfd, stdout, val);
-  else
+  switch (print_width)
     {
     {
-      char buf[30];
-      char *s;
+    case 32:
+      printf (value_format_32bit, (unsigned long) val);
+      break;
 
 
-      s = buf + sizeof buf;
-      *--s = '\0';
-      while (val > 0)
+    case 64:
+#if BFD_HOST_64BIT_LONG || BFD_HOST_64BIT_LONG_LONG
+      printf (value_format_64bit, val);
+#else
+      /* We have a 64 bit value to print, but the host is only 32 bit.  */
+      if (print_radix == 16)
+       bfd_fprintf_vma (abfd, stdout, val);
+      else
        {
        {
-         *--s = (val % print_radix) + '0';
-         val /= print_radix;
+         char buf[30];
+         char *s;
+
+         s = buf + sizeof buf;
+         *--s = '\0';
+         while (val > 0)
+           {
+             *--s = (val % print_radix) + '0';
+             val /= print_radix;
+           }
+         while ((buf + sizeof buf - 1) - s < 16)
+           *--s = '0';
+         printf ("%s", s);
        }
        }
-      while ((buf + sizeof buf - 1) - s < 16)
-       *--s = '0';
-      printf ("%s", s);
-    }
 #endif
 #endif
+      break;
+
+    default:
+      fatal (_("Print width has not been initialized (%d)"), print_width);
+      break;
+    }
 }
 
 /* Print a line of information about a symbol.  */
 }
 
 /* Print a line of information about a symbol.  */
@@ -1368,7 +1416,7 @@ print_symbol_info_bsd (struct extended_symbol_info *info, bfd *abfd)
 {
   if (bfd_is_undefined_symclass (SYM_TYPE (info)))
     {
 {
   if (bfd_is_undefined_symclass (SYM_TYPE (info)))
     {
-      if (print_width == 16)
+      if (print_width == 64)
        printf ("        ");
       printf ("        ");
     }
        printf ("        ");
       printf ("        ");
     }
@@ -1411,7 +1459,7 @@ print_symbol_info_sysv (struct extended_symbol_info *info, bfd *abfd)
 
   if (bfd_is_undefined_symclass (SYM_TYPE (info)))
     {
 
   if (bfd_is_undefined_symclass (SYM_TYPE (info)))
     {
-      if (print_width == 8)
+      if (print_width == 32)
        printf ("        ");
       else
        printf ("                ");
        printf ("        ");
       else
        printf ("                ");
@@ -1441,7 +1489,7 @@ print_symbol_info_sysv (struct extended_symbol_info *info, bfd *abfd)
        print_value (abfd, SYM_SIZE (info));
       else
        {
        print_value (abfd, SYM_SIZE (info));
       else
        {
-         if (print_width == 8)
+         if (print_width == 32)
            printf ("        ");
          else
            printf ("                ");
            printf ("        ");
          else
            printf ("                ");
@@ -1489,6 +1537,9 @@ main (int argc, char **argv)
 
   program_name = *argv;
   xmalloc_set_program_name (program_name);
 
   program_name = *argv;
   xmalloc_set_program_name (program_name);
+#if BFD_SUPPORTS_PLUGINS
+  bfd_plugin_set_program_name (program_name);
+#endif
 
   START_PROGRESS (program_name, 0);
 
 
   START_PROGRESS (program_name, 0);
 
@@ -1546,10 +1597,19 @@ main (int argc, char **argv)
          break;
        case 'n':
        case 'v':
          break;
        case 'n':
        case 'v':
+         no_sort = 0;
          sort_numerically = 1;
          sort_numerically = 1;
+         sort_by_size = 0;
          break;
        case 'p':
          no_sort = 1;
          break;
        case 'p':
          no_sort = 1;
+         sort_numerically = 0;
+         sort_by_size = 0;
+         break;
+       case OPTION_SIZE_SORT:
+         no_sort = 0;
+         sort_numerically = 0;
+         sort_by_size = 1;
          break;
        case 'P':
          set_output_format ("posix");
          break;
        case 'P':
          set_output_format ("posix");
@@ -1588,6 +1648,14 @@ main (int argc, char **argv)
          target = optarg;
          break;
 
          target = optarg;
          break;
 
+       case OPTION_PLUGIN:     /* --plugin */
+#if BFD_SUPPORTS_PLUGINS
+         bfd_plugin_set_plugin (optarg);
+#else
+         fatal (_("sorry - this program has been built without plugin support\n"));
+#endif
+         break;
+
        case 0:         /* A long option that just sets a flag.  */
          break;
 
        case 0:         /* A long option that just sets a flag.  */
          break;