gdb: add target_ops::supports_displaced_step
[deliverable/binutils-gdb.git] / binutils / size.c
index 8804a43a2b43deaf5449b64d1224ba695a55d5fc..369708771476d2afead60b844b169ac422675651 100644 (file)
@@ -1,12 +1,11 @@
 /* size.c -- report size of various sections of an executable file.
 /* size.c -- report size of various sections of an executable file.
-   Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002
-   Free Software Foundation, Inc.
+   Copyright (C) 1991-2020 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,
@@ -16,7 +15,8 @@
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
 \f
 /* Extensions/incompatibilities:
    o - BSD output has filenames at the end.
 \f
 /* Extensions/incompatibilities:
    o - BSD output has filenames at the end.
    If you write shell scripts which manipulate this info then you may be
    out of luck; there's no --compatibility or --pedantic option.  */
 
    If you write shell scripts which manipulate this info then you may be
    out of luck; there's no --compatibility or --pedantic option.  */
 
+#include "sysdep.h"
 #include "bfd.h"
 #include "bfd.h"
-#include "bucomm.h"
 #include "libiberty.h"
 #include "getopt.h"
 #include "libiberty.h"
 #include "getopt.h"
+#include "bucomm.h"
 
 #ifndef BSD_DEFAULT
 #define BSD_DEFAULT 1
 
 #ifndef BSD_DEFAULT
 #define BSD_DEFAULT 1
 
 /* Program options.  */
 
 
 /* Program options.  */
 
-enum
+static enum
   {
     decimal, octal, hex
   }
 radix = decimal;
 
   {
     decimal, octal, hex
   }
 radix = decimal;
 
-int berkeley_format = BSD_DEFAULT;     /* 0 means use AT&T-style output.  */
-int show_version = 0;
-int show_help = 0;
-int show_totals = 0;
+/* Select the desired output format.  */
+enum output_format
+  {
+   FORMAT_BERKLEY,
+   FORMAT_SYSV,
+   FORMAT_GNU
+  };
+static enum output_format selected_output_format =
+#if BSD_DEFAULT
+  FORMAT_BERKLEY
+#else
+  FORMAT_SYSV
+#endif
+  ;
+
+static int show_version = 0;
+static int show_help = 0;
+static int show_totals = 0;
+static int show_common = 0;
 
 
+static bfd_size_type common_size;
 static bfd_size_type total_bsssize;
 static bfd_size_type total_datasize;
 static bfd_size_type total_textsize;
 
 /* Program exit status.  */
 static bfd_size_type total_bsssize;
 static bfd_size_type total_datasize;
 static bfd_size_type total_textsize;
 
 /* Program exit status.  */
-int return_code = 0;
+static int return_code = 0;
 
 static char *target = NULL;
 
 
 static char *target = NULL;
 
-/* Static declarations.  */
+/* Forward declarations.  */
 
 
-static void usage                 PARAMS ((FILE *, int));
-static void display_file          PARAMS ((char *));
-static void display_bfd           PARAMS ((bfd *));
-static void display_archive       PARAMS ((bfd *));
-static int size_number            PARAMS ((bfd_size_type));
-#if 0
-static void lprint_number         PARAMS ((int, bfd_size_type));
-#endif
-static void rprint_number         PARAMS ((int, bfd_size_type));
-static void print_berkeley_format PARAMS ((bfd *));
-static void sysv_internal_sizer   PARAMS ((bfd *, asection *, PTR));
-static void sysv_internal_printer PARAMS ((bfd *, asection *, PTR));
-static void print_sysv_format     PARAMS ((bfd *));
-static void print_sizes           PARAMS ((bfd * file));
-static void berkeley_sum          PARAMS ((bfd *, sec_ptr, PTR));
+static void display_file (char *);
+static void rprint_number (int, bfd_size_type);
+static void print_sizes (bfd * file);
 \f
 static void
 \f
 static void
-usage (stream, status)
-     FILE *stream;
-     int status;
+usage (FILE *stream, int status)
 {
   fprintf (stream, _("Usage: %s [option(s)] [file(s)]\n"), program_name);
   fprintf (stream, _(" Displays the sizes of sections inside binary files\n"));
   fprintf (stream, _(" If no input file(s) are specified, a.out is assumed\n"));
   fprintf (stream, _(" The options are:\n\
 {
   fprintf (stream, _("Usage: %s [option(s)] [file(s)]\n"), program_name);
   fprintf (stream, _(" Displays the sizes of sections inside binary files\n"));
   fprintf (stream, _(" If no input file(s) are specified, a.out is assumed\n"));
   fprintf (stream, _(" The options are:\n\
-  -A|-B     --format={sysv|berkeley}  Select output style (default is %s)\n\
+  -A|-B|-G  --format={sysv|berkeley|gnu}  Select output style (default is %s)\n\
   -o|-d|-x  --radix={8|10|16}         Display numbers in octal, decimal or hex\n\
   -t        --totals                  Display the total sizes (Berkeley only)\n\
   -o|-d|-x  --radix={8|10|16}         Display numbers in octal, decimal or hex\n\
   -t        --totals                  Display the total sizes (Berkeley only)\n\
+            --common                  Display total size for *COM* syms\n\
             --target=<bfdname>        Set the binary file format\n\
             --target=<bfdname>        Set the binary file format\n\
+            @<file>                   Read options from <file>\n\
   -h        --help                    Display this information\n\
   -v        --version                 Display the program's version\n\
 \n"),
   -h        --help                    Display this information\n\
   -v        --version                 Display the program's version\n\
 \n"),
@@ -100,28 +105,31 @@ usage (stream, status)
 #endif
 );
   list_supported_targets (program_name, stream);
 #endif
 );
   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);
 }
 
-struct option long_options[] =
+#define OPTION_FORMAT (200)
+#define OPTION_RADIX (OPTION_FORMAT + 1)
+#define OPTION_TARGET (OPTION_RADIX + 1)
+
+static struct option long_options[] =
 {
 {
-  {"format", required_argument, 0, 200},
-  {"radix", required_argument, 0, 201},
-  {"target", required_argument, 0, 202},
+  {"common", no_argument, &show_common, 1},
+  {"format", required_argument, 0, OPTION_FORMAT},
+  {"radix", required_argument, 0, OPTION_RADIX},
+  {"target", required_argument, 0, OPTION_TARGET},
   {"totals", no_argument, &show_totals, 1},
   {"version", no_argument, &show_version, 1},
   {"help", no_argument, &show_help, 1},
   {0, no_argument, 0, 0}
 };
 
   {"totals", no_argument, &show_totals, 1},
   {"version", no_argument, &show_version, 1},
   {"help", no_argument, &show_help, 1},
   {0, no_argument, 0, 0}
 };
 
-int main PARAMS ((int, char **));
+int main (int, char **);
 
 int
 
 int
-main (argc, argv)
-     int argc;
-     char **argv;
+main (int argc, char **argv)
 {
   int temp;
   int c;
 {
   int temp;
   int c;
@@ -137,24 +145,32 @@ main (argc, argv)
 
   program_name = *argv;
   xmalloc_set_program_name (program_name);
 
   program_name = *argv;
   xmalloc_set_program_name (program_name);
+  bfd_set_error_program_name (program_name);
 
 
-  bfd_init ();
+  expandargv (&argc, &argv);
+
+  if (bfd_init () != BFD_INIT_MAGIC)
+    fatal (_("fatal error: libbfd ABI mismatch"));
   set_default_bfd_target ();
 
   set_default_bfd_target ();
 
-  while ((c = getopt_long (argc, argv, "ABHhVvdfotx", long_options,
+  while ((c = getopt_long (argc, argv, "ABGHhVvdfotx", long_options,
                           (int *) 0)) != EOF)
     switch (c)
       {
                           (int *) 0)) != EOF)
     switch (c)
       {
-      case 200:                /* --format */
+      case OPTION_FORMAT:
        switch (*optarg)
          {
          case 'B':
          case 'b':
        switch (*optarg)
          {
          case 'B':
          case 'b':
-           berkeley_format = 1;
+           selected_output_format = FORMAT_BERKLEY;
            break;
          case 'S':
          case 's':
            break;
          case 'S':
          case 's':
-           berkeley_format = 0;
+           selected_output_format = FORMAT_SYSV;
+           break;
+         case 'G':
+         case 'g':
+           selected_output_format = FORMAT_GNU;
            break;
          default:
            non_fatal (_("invalid argument to --format: %s"), optarg);
            break;
          default:
            non_fatal (_("invalid argument to --format: %s"), optarg);
@@ -162,11 +178,11 @@ main (argc, argv)
          }
        break;
 
          }
        break;
 
-      case 202:                /* --target */
+      case OPTION_TARGET:
        target = optarg;
        break;
 
        target = optarg;
        break;
 
-      case 201:                /* --radix */
+      case OPTION_RADIX:
 #ifdef ANSI_LIBRARIES
        temp = strtol (optarg, NULL, 10);
 #else
 #ifdef ANSI_LIBRARIES
        temp = strtol (optarg, NULL, 10);
 #else
@@ -190,10 +206,13 @@ main (argc, argv)
        break;
 
       case 'A':
        break;
 
       case 'A':
-       berkeley_format = 0;
+       selected_output_format = FORMAT_SYSV;
        break;
       case 'B':
        break;
       case 'B':
-       berkeley_format = 1;
+       selected_output_format = FORMAT_BERKLEY;
+       break;
+      case 'G':
+       selected_output_format = FORMAT_GNU;
        break;
       case 'v':
       case 'V':
        break;
       case 'v':
       case 'V':
@@ -240,28 +259,68 @@ main (argc, argv)
     for (; optind < argc;)
       display_file (argv[optind++]);
 
     for (; optind < argc;)
       display_file (argv[optind++]);
 
-  if (show_totals && berkeley_format)
+  if (show_totals && (selected_output_format == FORMAT_BERKLEY
+                     || selected_output_format == FORMAT_GNU))
     {
       bfd_size_type total = total_textsize + total_datasize + total_bsssize;
     {
       bfd_size_type total = total_textsize + total_datasize + total_bsssize;
-
-      rprint_number (7, total_textsize);
-      putchar('\t');
-      rprint_number (7, total_datasize);
-      putchar('\t');
-      rprint_number (7, total_bsssize);
-      printf (((radix == octal) ? "\t%7lo\t%7lx\t" : "\t%7lu\t%7lx\t"),
-             (unsigned long) total, (unsigned long) total);
+      int col_width = (selected_output_format == FORMAT_BERKLEY) ? 7 : 10;
+      char sep_char = (selected_output_format == FORMAT_BERKLEY) ? '\t' : ' ';
+
+      rprint_number (col_width, total_textsize);
+      putchar(sep_char);
+      rprint_number (col_width, total_datasize);
+      putchar(sep_char);
+      rprint_number (col_width, total_bsssize);
+      putchar(sep_char);
+      if (selected_output_format == FORMAT_BERKLEY)
+       printf (((radix == octal) ? "%7lo\t%7lx" : "%7lu\t%7lx"),
+               (unsigned long) total, (unsigned long) total);
+      else
+       rprint_number (col_width, total);
+      putchar(sep_char);
       fputs ("(TOTALS)\n", stdout);
     }
 
   return return_code;
 }
 \f
       fputs ("(TOTALS)\n", stdout);
     }
 
   return return_code;
 }
 \f
+/* Total size required for common symbols in ABFD.  */
+
+static void
+calculate_common_size (bfd *abfd)
+{
+  asymbol **syms = NULL;
+  long storage, symcount;
+
+  common_size = 0;
+  if ((bfd_get_file_flags (abfd) & (EXEC_P | DYNAMIC | HAS_SYMS)) != HAS_SYMS)
+    return;
+
+  storage = bfd_get_symtab_upper_bound (abfd);
+  if (storage < 0)
+    bfd_fatal (bfd_get_filename (abfd));
+  if (storage)
+    syms = (asymbol **) xmalloc (storage);
+
+  symcount = bfd_canonicalize_symtab (abfd, syms);
+  if (symcount < 0)
+    bfd_fatal (bfd_get_filename (abfd));
+
+  while (--symcount >= 0)
+    {
+      asymbol *sym = syms[symcount];
+
+      if (bfd_is_com_section (sym->section)
+         && (sym->flags & BSF_SECTION_SYM) == 0)
+       common_size += sym->value;
+    }
+  free (syms);
+}
+
 /* Display stats on file or archive member ABFD.  */
 
 static void
 /* Display stats on file or archive member ABFD.  */
 
 static void
-display_bfd (abfd)
-     bfd *abfd;
+display_bfd (bfd *abfd)
 {
   char **matching;
 
 {
   char **matching;
 
@@ -312,8 +371,7 @@ display_bfd (abfd)
 }
 
 static void
 }
 
 static void
-display_archive (file)
-     bfd *file;
+display_archive (bfd *file)
 {
   bfd *arfile = (bfd *) NULL;
   bfd *last_arfile = (bfd *) NULL;
 {
   bfd *arfile = (bfd *) NULL;
   bfd *last_arfile = (bfd *) NULL;
@@ -336,7 +394,14 @@ display_archive (file)
       display_bfd (arfile);
 
       if (last_arfile != NULL)
       display_bfd (arfile);
 
       if (last_arfile != NULL)
-       bfd_close (last_arfile);
+       {
+         bfd_close (last_arfile);
+
+         /* PR 17512: file: a244edbc.  */
+         if (last_arfile == arfile)
+           return;
+       }
+
       last_arfile = arfile;
     }
 
       last_arfile = arfile;
     }
 
@@ -345,11 +410,17 @@ display_archive (file)
 }
 
 static void
 }
 
 static void
-display_file (filename)
-     char *filename;
+display_file (char *filename)
 {
 {
-  bfd *file = bfd_openr (filename, target);
+  bfd *file;
+
+  if (get_file_size (filename) < 1)
+    {
+      return_code = 1;
+      return;
+    }
 
 
+  file = bfd_openr (filename, target);
   if (file == NULL)
     {
       bfd_nonfatal (filename);
   if (file == NULL)
     {
       bfd_nonfatal (filename);
@@ -357,12 +428,12 @@ display_file (filename)
       return;
     }
 
       return;
     }
 
-  if (bfd_check_format (file, bfd_archive) == true)
+  if (bfd_check_format (file, bfd_archive))
     display_archive (file);
   else
     display_bfd (file);
 
     display_archive (file);
   else
     display_bfd (file);
 
-  if (bfd_close (file) == false)
+  if (!bfd_close (file))
     {
       bfd_nonfatal (filename);
       return_code = 1;
     {
       bfd_nonfatal (filename);
       return_code = 1;
@@ -370,54 +441,28 @@ display_file (filename)
     }
 }
 \f
     }
 }
 \f
-/* This is what lexical functions are for.  */
-
 static int
 static int
-size_number (num)
-     bfd_size_type num;
+size_number (bfd_size_type num)
 {
   char buffer[40];
 
   sprintf (buffer,
 {
   char buffer[40];
 
   sprintf (buffer,
-          (radix == decimal ? "%lu" :
-          ((radix == octal) ? "0%lo" : "0x%lx")),
-          (unsigned long) num);
+          (radix == decimal ? "%" BFD_VMA_FMT "u" :
+          ((radix == octal) ? "0%" BFD_VMA_FMT "o" : "0x%" BFD_VMA_FMT "x")),
+          num);
 
   return strlen (buffer);
 }
 
 
   return strlen (buffer);
 }
 
-#if 0
-
-/* This is not used.  */
-
 static void
 static void
-lprint_number (width, num)
-     int width;
-     bfd_size_type num;
+rprint_number (int width, bfd_size_type num)
 {
   char buffer[40];
 
   sprintf (buffer,
 {
   char buffer[40];
 
   sprintf (buffer,
-          (radix == decimal ? "%lu" :
-          ((radix == octal) ? "0%lo" : "0x%lx")),
-          (unsigned long) num);
-
-  printf ("%-*s", width, buffer);
-}
-
-#endif
-
-static void
-rprint_number (width, num)
-     int width;
-     bfd_size_type num;
-{
-  char buffer[40];
-
-  sprintf (buffer,
-          (radix == decimal ? "%lu" :
-          ((radix == octal) ? "0%lo" : "0x%lx")),
-          (unsigned long) num);
+          (radix == decimal ? "%" BFD_VMA_FMT "u" :
+          ((radix == octal) ? "0%" BFD_VMA_FMT "o" : "0x%" BFD_VMA_FMT "x")),
+          num);
 
   printf ("%*s", width, buffer);
 }
 
   printf ("%*s", width, buffer);
 }
@@ -427,20 +472,20 @@ static bfd_size_type datasize;
 static bfd_size_type textsize;
 
 static void
 static bfd_size_type textsize;
 
 static void
-berkeley_sum (abfd, sec, ignore)
-     bfd *abfd ATTRIBUTE_UNUSED;
-     sec_ptr sec;
-     PTR ignore ATTRIBUTE_UNUSED;
+berkeley_or_gnu_sum (bfd *abfd ATTRIBUTE_UNUSED, sec_ptr sec,
+                    void *ignore ATTRIBUTE_UNUSED)
 {
   flagword flags;
   bfd_size_type size;
 
 {
   flagword flags;
   bfd_size_type size;
 
-  flags = bfd_get_section_flags (abfd, sec);
+  flags = bfd_section_flags (sec);
   if ((flags & SEC_ALLOC) == 0)
     return;
 
   if ((flags & SEC_ALLOC) == 0)
     return;
 
-  size = bfd_get_section_size_before_reloc (sec);
-  if ((flags & SEC_CODE) != 0 || (flags & SEC_READONLY) != 0)
+  size = bfd_section_size (sec);
+  if ((flags & SEC_CODE) != 0
+      || (selected_output_format == FORMAT_BERKLEY
+         && (flags & SEC_READONLY) != 0))
     textsize += size;
   else if ((flags & SEC_HAS_CONTENTS) != 0)
     datasize += size;
     textsize += size;
   else if ((flags & SEC_HAS_CONTENTS) != 0)
     datasize += size;
@@ -449,27 +494,28 @@ berkeley_sum (abfd, sec, ignore)
 }
 
 static void
 }
 
 static void
-print_berkeley_format (abfd)
-     bfd *abfd;
+print_berkeley_or_gnu_format (bfd *abfd)
 {
   static int files_seen = 0;
   bfd_size_type total;
 {
   static int files_seen = 0;
   bfd_size_type total;
+  int col_width = (selected_output_format == FORMAT_BERKLEY) ? 7 : 10;
+  char sep_char = (selected_output_format == FORMAT_BERKLEY) ? '\t' : ' ';
 
   bsssize = 0;
   datasize = 0;
   textsize = 0;
 
 
   bsssize = 0;
   datasize = 0;
   textsize = 0;
 
-  bfd_map_over_sections (abfd, berkeley_sum, (PTR) NULL);
+  bfd_map_over_sections (abfd, berkeley_or_gnu_sum, NULL);
 
 
+  bsssize += common_size;
   if (files_seen++ == 0)
   if (files_seen++ == 0)
-#if 0
-    /* Intel doesn't like bss/stk because they don't have core files.  */
-    puts ((radix == octal) ? "   text\t   data\tbss/stk\t    oct\t    hex\tfilename" :
-         "   text\t   data\tbss/stk\t    dec\t    hex\tfilename");
-#else
-    puts ((radix == octal) ? "   text\t   data\t    bss\t    oct\t    hex\tfilename" :
-         "   text\t   data\t    bss\t    dec\t    hex\tfilename");
-#endif
+    {
+      if (selected_output_format == FORMAT_BERKLEY)
+       puts ((radix == octal) ? "   text\t   data\t    bss\t    oct\t    hex\tfilename" :
+             "   text\t   data\t    bss\t    dec\t    hex\tfilename");
+      else
+       puts ("      text       data        bss      total filename");
+    }
 
   total = textsize + datasize + bsssize;
 
 
   total = textsize + datasize + bsssize;
 
@@ -480,18 +526,24 @@ print_berkeley_format (abfd)
       total_bsssize  += bsssize;
     }
 
       total_bsssize  += bsssize;
     }
 
-  rprint_number (7, textsize);
-  putchar ('\t');
-  rprint_number (7, datasize);
-  putchar ('\t');
-  rprint_number (7, bsssize);
-  printf (((radix == octal) ? "\t%7lo\t%7lx\t" : "\t%7lu\t%7lx\t"),
-         (unsigned long) total, (unsigned long) total);
+  rprint_number (col_width, textsize);
+  putchar (sep_char);
+  rprint_number (col_width, datasize);
+  putchar (sep_char);
+  rprint_number (col_width, bsssize);
+  putchar (sep_char);
 
 
+  if (selected_output_format == FORMAT_BERKLEY)
+    printf (((radix == octal) ? "%7lo\t%7lx" : "%7lu\t%7lx"),
+           (unsigned long) total, (unsigned long) total);
+  else
+    rprint_number (col_width, total);
+
+  putchar (sep_char);
   fputs (bfd_get_filename (abfd), stdout);
 
   fputs (bfd_get_filename (abfd), stdout);
 
-  if (bfd_my_archive (abfd))
-    printf (" (ex %s)", bfd_get_filename (bfd_my_archive (abfd)));
+  if (abfd->my_archive)
+    printf (" (ex %s)", bfd_get_filename (abfd->my_archive));
 }
 
 /* I REALLY miss lexical functions! */
 }
 
 /* I REALLY miss lexical functions! */
@@ -502,60 +554,78 @@ int svi_vmalen = 0;
 int svi_sizelen = 0;
 
 static void
 int svi_sizelen = 0;
 
 static void
-sysv_internal_sizer (file, sec, ignore)
-     bfd *file ATTRIBUTE_UNUSED;
-     sec_ptr sec;
-     PTR ignore ATTRIBUTE_UNUSED;
+sysv_internal_sizer (bfd *file ATTRIBUTE_UNUSED, sec_ptr sec,
+                    void *ignore ATTRIBUTE_UNUSED)
 {
 {
-  bfd_size_type size = bfd_section_size (file, sec);
+  flagword flags = bfd_section_flags (sec);
+  /* Exclude sections with no flags set.  This is to omit som spaces.  */
+  if (flags == 0)
+    return;
 
   if (   ! bfd_is_abs_section (sec)
       && ! bfd_is_com_section (sec)
       && ! bfd_is_und_section (sec))
     {
 
   if (   ! bfd_is_abs_section (sec)
       && ! bfd_is_com_section (sec)
       && ! bfd_is_und_section (sec))
     {
-      int namelen = strlen (bfd_section_name (file, sec));
+      bfd_size_type size = bfd_section_size (sec);
+      int namelen = strlen (bfd_section_name (sec));
 
       if (namelen > svi_namelen)
        svi_namelen = namelen;
 
       svi_total += size;
 
 
       if (namelen > svi_namelen)
        svi_namelen = namelen;
 
       svi_total += size;
 
-      if (bfd_section_vma (file, sec) > svi_maxvma)
-       svi_maxvma = bfd_section_vma (file, sec);
+      if (bfd_section_vma (sec) > svi_maxvma)
+       svi_maxvma = bfd_section_vma (sec);
     }
 }
 
 static void
     }
 }
 
 static void
-sysv_internal_printer (file, sec, ignore)
-     bfd *file ATTRIBUTE_UNUSED;
-     sec_ptr sec;
-     PTR ignore ATTRIBUTE_UNUSED;
+sysv_one_line (const char *name, bfd_size_type size, bfd_vma vma)
 {
 {
-  bfd_size_type size = bfd_section_size (file, sec);
+  printf ("%-*s   ", svi_namelen, name);
+  rprint_number (svi_sizelen, size);
+  printf ("   ");
+  rprint_number (svi_vmalen, vma);
+  printf ("\n");
+}
+
+static void
+sysv_internal_printer (bfd *file ATTRIBUTE_UNUSED, sec_ptr sec,
+                      void *ignore ATTRIBUTE_UNUSED)
+{
+  flagword flags = bfd_section_flags (sec);
+  if (flags == 0)
+    return;
 
   if (   ! bfd_is_abs_section (sec)
       && ! bfd_is_com_section (sec)
       && ! bfd_is_und_section (sec))
     {
 
   if (   ! bfd_is_abs_section (sec)
       && ! bfd_is_com_section (sec)
       && ! bfd_is_und_section (sec))
     {
+      bfd_size_type size = bfd_section_size (sec);
+
       svi_total += size;
 
       svi_total += size;
 
-      printf ("%-*s   ", svi_namelen, bfd_section_name (file, sec));
-      rprint_number (svi_sizelen, size);
-      printf ("   ");
-      rprint_number (svi_vmalen, bfd_section_vma (file, sec));
-      printf ("\n");
+      sysv_one_line (bfd_section_name (sec),
+                    size,
+                    bfd_section_vma (sec));
     }
 }
 
 static void
     }
 }
 
 static void
-print_sysv_format (file)
-     bfd *file;
+print_sysv_format (bfd *file)
 {
   /* Size all of the columns.  */
   svi_total = 0;
   svi_maxvma = 0;
   svi_namelen = 0;
 {
   /* Size all of the columns.  */
   svi_total = 0;
   svi_maxvma = 0;
   svi_namelen = 0;
-  bfd_map_over_sections (file, sysv_internal_sizer, (PTR) NULL);
+  bfd_map_over_sections (file, sysv_internal_sizer, NULL);
+  if (show_common)
+    {
+      if (svi_namelen < (int) sizeof ("*COM*") - 1)
+       svi_namelen = sizeof ("*COM*") - 1;
+      svi_total += common_size;
+    }
+
   svi_vmalen = size_number ((bfd_size_type)svi_maxvma);
 
   if ((size_t) svi_vmalen < sizeof ("addr") - 1)
   svi_vmalen = size_number ((bfd_size_type)svi_maxvma);
 
   if ((size_t) svi_vmalen < sizeof ("addr") - 1)
@@ -568,13 +638,18 @@ print_sysv_format (file)
   svi_total = 0;
   printf ("%s  ", bfd_get_filename (file));
 
   svi_total = 0;
   printf ("%s  ", bfd_get_filename (file));
 
-  if (bfd_my_archive (file))
-    printf (" (ex %s)", bfd_get_filename (bfd_my_archive (file)));
+  if (file->my_archive)
+    printf (" (ex %s)", bfd_get_filename (file->my_archive));
 
   printf (":\n%-*s   %*s   %*s\n", svi_namelen, "section",
          svi_sizelen, "size", svi_vmalen, "addr");
 
 
   printf (":\n%-*s   %*s   %*s\n", svi_namelen, "section",
          svi_sizelen, "size", svi_vmalen, "addr");
 
-  bfd_map_over_sections (file, sysv_internal_printer, (PTR) NULL);
+  bfd_map_over_sections (file, sysv_internal_printer, NULL);
+  if (show_common)
+    {
+      svi_total += common_size;
+      sysv_one_line ("*COM*", common_size, 0);
+    }
 
   printf ("%-*s   ", svi_namelen, "Total");
   rprint_number (svi_sizelen, svi_total);
 
   printf ("%-*s   ", svi_namelen, "Total");
   rprint_number (svi_sizelen, svi_total);
@@ -582,11 +657,12 @@ print_sysv_format (file)
 }
 
 static void
 }
 
 static void
-print_sizes (file)
-     bfd *file;
+print_sizes (bfd *file)
 {
 {
-  if (berkeley_format)
-    print_berkeley_format (file);
-  else
+  if (show_common)
+    calculate_common_size (file);
+  if (selected_output_format == FORMAT_SYSV)
     print_sysv_format (file);
     print_sysv_format (file);
+  else
+    print_berkeley_or_gnu_format (file);
 }
 }
This page took 0.038818 seconds and 4 git commands to generate.