Add --totals option to size

This commit is contained in:
Nick Clifton 2002-01-25 15:37:04 +00:00
parent 3d66c4f7df
commit 15c82623b1
5 changed files with 114 additions and 44 deletions

View File

@ -1,3 +1,20 @@
2002-01-25 Jason R. Thorpe <thorpej@wasabisystems.com>
* objcopy.c (strip_usage): Document -d as an alias
--strip-debug.
* size.c (usage): Document [-t | --totals] options.
(long_options): Add --totals option.
(main): If the [-t | --totals] option is specified and
the output format is Berkeley-style, print the total
text, data, and bss sizes of all objects listed.
(print_berkeley_format): If the [-t | --totals] option
is specified, track the total text, data, and bss
sizes.
* doc/binutils.texi (size): Document [-t | --totals] options.
(strip): Document -d as an alias for --strip-debug.
* NEWS: Mention new feature of size.
2002-01-25 Nick Clifton <nickc@cambridge.redhat.com> 2002-01-25 Nick Clifton <nickc@cambridge.redhat.com>
* po/fr.po: Updated version. * po/fr.po: Updated version.

View File

@ -1,5 +1,7 @@
-*- text -*- -*- text -*-
* size: Add --totals to display summary of sizes (Berkeley format only).
* readelf: Add --wide option to not break section header or segment listing * readelf: Add --wide option to not break section header or segment listing
lines to fit into 80 columns. lines to fit into 80 columns.

View File

@ -1,6 +1,6 @@
\input texinfo @c -*- Texinfo -*- \input texinfo @c -*- Texinfo -*-
@setfilename binutils.info @setfilename binutils.info
@c Copyright 2001 Free Software Foundation, Inc. @c Copyright 2001, 2002 Free Software Foundation, Inc.
@include config.texi @include config.texi
@ -29,7 +29,7 @@ END-INFO-DIR-ENTRY
@ifinfo @ifinfo
@c man begin COPYRIGHT @c man begin COPYRIGHT
Copyright @copyright{} 1991, 92, 93, 94, 95, 96, 97, 98, 99, 2000, 2001 Free Software Foundation, Inc. Copyright @copyright{} 1991, 92, 93, 94, 95, 96, 97, 98, 99, 2000, 2001, 2002 Free Software Foundation, Inc.
Permission is granted to copy, distribute and/or modify this document Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.1 under the terms of the GNU Free Documentation License, Version 1.1
@ -53,7 +53,7 @@ notice identical to this one except for the removal of this paragraph
@c This file documents the GNU binary utilities "ar", "ld", "objcopy", @c This file documents the GNU binary utilities "ar", "ld", "objcopy",
@c "objdump", "nm", "size", "strings", "strip", "readelf" and "ranlib". @c "objdump", "nm", "size", "strings", "strip", "readelf" and "ranlib".
@c @c
@c Copyright (C) 1991, 92, 93, 94, 95, 96, 97, 98, 99, 2000, 2001 Free Software Foundation, Inc. @c Copyright (C) 1991, 92, 93, 94, 95, 96, 97, 98, 99, 2000, 2001, 2002 Free Software Foundation, Inc.
@c @c
@c This text may be freely distributed under the terms of the GNU @c This text may be freely distributed under the terms of the GNU
@c Free Documentation License. @c Free Documentation License.
@ -78,7 +78,7 @@ notice identical to this one except for the removal of this paragraph
@end tex @end tex
@vskip 0pt plus 1filll @vskip 0pt plus 1filll
Copyright @copyright{} 1991, 92, 93, 94, 95, 96, 97, 1998, 2000, 2001 Free Software Foundation, Inc. Copyright @copyright{} 1991, 92, 93, 94, 95, 96, 97, 1998, 2000, 2001, 2002 Free Software Foundation, Inc.
Permission is granted to copy, distribute and/or modify this document Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.1 under the terms of the GNU Free Documentation License, Version 1.1
@ -1757,7 +1757,9 @@ ar(1), nm(1), and the Info entries for @file{binutils}.
@smallexample @smallexample
@c man begin SYNOPSIS size @c man begin SYNOPSIS size
size [@option{-A}|@option{-B}|@option{--format=}@var{compatibility}] size [@option{-A}|@option{-B}|@option{--format=}@var{compatibility}]
[@option{--help}] [@option{-d}|@option{-o}|@option{-x}|@option{--radix=}@var{number}] [@option{--help}]
[@option{-d}|@option{-o}|@option{-x}|@option{--radix=}@var{number}]
[@option{-t}|@option{--totals}]
[@option{--target=}@var{bfdname}] [@option{-V}|@option{--version}] [@option{--target=}@var{bfdname}] [@option{-V}|@option{--version}]
[@var{objfile}@dots{}] [@var{objfile}@dots{}]
@c man end @c man end
@ -1840,6 +1842,10 @@ values (8, 10, 16) are supported. The total size is always given in two
radices; decimal and hexadecimal for @option{-d} or @option{-x} output, or radices; decimal and hexadecimal for @option{-d} or @option{-x} output, or
octal and hexadecimal if you're using @option{-o}. octal and hexadecimal if you're using @option{-o}.
@item -t
@itemx --totals
Show totals of all objects listed (Berkeley format listing mode only).
@item --target=@var{bfdname} @item --target=@var{bfdname}
@cindex object code format @cindex object code format
Specify that the object-code format for @var{objfile} is Specify that the object-code format for @var{objfile} is
@ -1971,7 +1977,7 @@ and the Info entries for @file{binutils}.
strip [@option{-F} @var{bfdname} |@option{--target=}@var{bfdname} ] strip [@option{-F} @var{bfdname} |@option{--target=}@var{bfdname} ]
[@option{-I} @var{bfdname} |@option{--input-target=}@var{bfdname} ] [@option{-I} @var{bfdname} |@option{--input-target=}@var{bfdname} ]
[@option{-O} @var{bfdname} |@option{--output-target=}@var{bfdname} ] [@option{-O} @var{bfdname} |@option{--output-target=}@var{bfdname} ]
[@option{-s}|@option{--strip-all}] [@option{-S}|@option{-g}|@option{--strip-debug}] [@option{-s}|@option{--strip-all}] [@option{-S}|@option{-g}|@option{-d}|@option{--strip-debug}]
[@option{-K} @var{symbolname} |@option{--keep-symbol=}@var{symbolname} ] [@option{-K} @var{symbolname} |@option{--keep-symbol=}@var{symbolname} ]
[@option{-N} @var{symbolname} |@option{--strip-symbol=}@var{symbolname} ] [@option{-N} @var{symbolname} |@option{--strip-symbol=}@var{symbolname} ]
[@option{-x}|@option{--discard-all} ] [@option{-X} |@option{--discard-locals}] [@option{-x}|@option{--discard-all} ] [@option{-X} |@option{--discard-locals}]
@ -2028,6 +2034,7 @@ Remove all symbols.
@item -g @item -g
@itemx -S @itemx -S
@itemx -d
@itemx --strip-debug @itemx --strip-debug
Remove debugging symbols only. Remove debugging symbols only.

View File

@ -440,7 +440,7 @@ strip_usage (stream, exit_status)
-p --preserve-dates Copy modified/access timestamps to the output\n\ -p --preserve-dates Copy modified/access timestamps to the output\n\
-R --remove-section=<name> Remove section <name> from the output\n\ -R --remove-section=<name> Remove section <name> from the output\n\
-s --strip-all Remove all symbol and relocation information\n\ -s --strip-all Remove all symbol and relocation information\n\
-g -S --strip-debug Remove all debugging symbols\n\ -g -S -d --strip-debug Remove all debugging symbols\n\
--strip-unneeded Remove all symbols not needed by relocations\n\ --strip-unneeded Remove all symbols not needed by relocations\n\
-N --strip-symbol=<name> Do not copy symbol <name>\n\ -N --strip-symbol=<name> Do not copy symbol <name>\n\
-K --keep-symbol=<name> Only copy symbol <name>\n\ -K --keep-symbol=<name> Only copy symbol <name>\n\

View File

@ -2,21 +2,21 @@
Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002 Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002
Free Software Foundation, Inc. Free Software Foundation, Inc.
This file is part of GNU Binutils. This file is part of GNU Binutils.
This program is free software; you can redistribute it and/or modify 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 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 2 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/* Extensions/incompatibilities: /* Extensions/incompatibilities:
o - BSD output has filenames at the end. o - BSD output has filenames at the end.
@ -26,8 +26,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
o - We also handle core files. o - We also handle core files.
o - We also handle archives. o - We also handle archives.
If you write shell scripts which manipulate this info then you may be If you write shell scripts which manipulate this info then you may be
out of luck; there's no --compatibility or --pedantic option. out of luck; there's no --compatibility or --pedantic option. */
*/
#include "bfd.h" #include "bfd.h"
#include "getopt.h" #include "getopt.h"
@ -43,33 +42,40 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
enum enum
{ {
decimal, octal, hex decimal, octal, hex
} radix = decimal; }
radix = decimal;
int berkeley_format = BSD_DEFAULT; /* 0 means use AT&T-style output. */ int berkeley_format = BSD_DEFAULT; /* 0 means use AT&T-style output. */
int show_version = 0; int show_version = 0;
int show_help = 0; int show_help = 0;
int show_totals = 0;
static bfd_size_type total_bsssize;
static bfd_size_type total_datasize;
static bfd_size_type total_textsize;
/* Program exit status. */ /* Program exit status. */
int return_code = 0; int return_code = 0;
static char *target = NULL; static char *target = NULL;
/* Static declarations */ /* Static declarations. */
static void usage PARAMS ((FILE *, int)); static void usage PARAMS ((FILE *, int));
static void display_file PARAMS ((char *filename)); static void display_file PARAMS ((char *));
static void display_bfd PARAMS ((bfd *)); static void display_bfd PARAMS ((bfd *));
static void display_archive PARAMS ((bfd *)); static void display_archive PARAMS ((bfd *));
static int size_number PARAMS ((bfd_size_type)); static int size_number PARAMS ((bfd_size_type));
#if 0 #if 0
static void lprint_number PARAMS ((int, bfd_size_type)); static void lprint_number PARAMS ((int, bfd_size_type));
#endif #endif
static void rprint_number PARAMS ((int, bfd_size_type)); static void rprint_number PARAMS ((int, bfd_size_type));
static void print_berkeley_format PARAMS ((bfd *)); static void print_berkeley_format PARAMS ((bfd *));
static void sysv_internal_sizer PARAMS ((bfd *, asection *, PTR)); static void sysv_internal_sizer PARAMS ((bfd *, asection *, PTR));
static void sysv_internal_printer PARAMS ((bfd *, asection *, PTR)); static void sysv_internal_printer PARAMS ((bfd *, asection *, PTR));
static void print_sysv_format PARAMS ((bfd *)); static void print_sysv_format PARAMS ((bfd *));
static void print_sizes PARAMS ((bfd * file)); static void print_sizes PARAMS ((bfd * file));
static void berkeley_sum PARAMS ((bfd *, sec_ptr, PTR)); static void berkeley_sum PARAMS ((bfd *, sec_ptr, PTR));
static void static void
usage (stream, status) usage (stream, status)
@ -82,6 +88,7 @@ usage (stream, status)
fprintf (stream, _(" The options are:\n\ fprintf (stream, _(" The options are:\n\
-A|-B --format={sysv|berkeley} Select output style (default is %s)\n\ -A|-B --format={sysv|berkeley} Select output style (default is %s)\n\
-o|-d|-h --radix={8|10|16} Display numbers in octal, decimal or hex\n\ -o|-d|-h --radix={8|10|16} Display numbers in octal, decimal or hex\n\
-t --totals Display the total sizes (Berkeley only)\n\
--target=<bfdname> Set the binary file format\n\ --target=<bfdname> Set the binary file format\n\
-h --help Display this information\n\ -h --help Display this information\n\
-v --version Display the program's version\n\ -v --version Display the program's version\n\
@ -103,6 +110,7 @@ struct option long_options[] =
{"format", required_argument, 0, 200}, {"format", required_argument, 0, 200},
{"radix", required_argument, 0, 201}, {"radix", required_argument, 0, 201},
{"target", required_argument, 0, 202}, {"target", required_argument, 0, 202},
{"totals", no_argument, &show_totals, 1},
{"version", no_argument, &show_version, 1}, {"version", no_argument, &show_version, 1},
{"help", no_argument, &show_help, 1}, {"help", no_argument, &show_help, 1},
{0, no_argument, 0, 0} {0, no_argument, 0, 0}
@ -133,7 +141,7 @@ main (argc, argv)
bfd_init (); bfd_init ();
set_default_bfd_target (); set_default_bfd_target ();
while ((c = getopt_long (argc, argv, "ABHhVvdfox", long_options, while ((c = getopt_long (argc, argv, "ABHhVvdfotx", long_options,
(int *) 0)) != EOF) (int *) 0)) != EOF)
switch (c) switch (c)
{ {
@ -200,6 +208,9 @@ main (argc, argv)
case 'o': case 'o':
radix = octal; radix = octal;
break; break;
case 't':
show_totals = 1;
break;
case 'f': /* FIXME : For sysv68, `-f' means `full format', i.e. case 'f': /* FIXME : For sysv68, `-f' means `full format', i.e.
`[fname:] M(.text) + N(.data) + O(.bss) + P(.comment) = Q' `[fname:] M(.text) + N(.data) + O(.bss) + P(.comment) = Q'
where `fname: ' appears only if there are >= 2 input files, where `fname: ' appears only if there are >= 2 input files,
@ -229,6 +240,20 @@ main (argc, argv)
for (; optind < argc;) for (; optind < argc;)
display_file (argv[optind++]); display_file (argv[optind++]);
if (show_totals && berkeley_format)
{
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);
fputs ("(TOTALS)\n", stdout);
}
return return_code; return return_code;
} }
@ -262,7 +287,7 @@ display_bfd (abfd)
if (bfd_check_format_matches (abfd, bfd_core, &matching)) if (bfd_check_format_matches (abfd, bfd_core, &matching))
{ {
CONST char *core_cmd; const char *core_cmd;
print_sizes (abfd); print_sizes (abfd);
fputs (" (core file", stdout); fputs (" (core file", stdout);
@ -308,7 +333,7 @@ display_archive (file)
} }
display_bfd (arfile); display_bfd (arfile);
/* Don't close the archive elements; we need them for next_archive */ /* Don't close the archive elements; we need them for next_archive. */
} }
} }
@ -317,6 +342,7 @@ display_file (filename)
char *filename; char *filename;
{ {
bfd *file = bfd_openr (filename, target); bfd *file = bfd_openr (filename, target);
if (file == NULL) if (file == NULL)
{ {
bfd_nonfatal (filename); bfd_nonfatal (filename);
@ -344,6 +370,7 @@ size_number (num)
bfd_size_type num; bfd_size_type num;
{ {
char buffer[40]; char buffer[40];
sprintf (buffer, sprintf (buffer,
(radix == decimal ? "%lu" : (radix == decimal ? "%lu" :
((radix == octal) ? "0%lo" : "0x%lx")), ((radix == octal) ? "0%lo" : "0x%lx")),
@ -362,6 +389,7 @@ lprint_number (width, num)
bfd_size_type num; bfd_size_type num;
{ {
char buffer[40]; char buffer[40];
sprintf (buffer, sprintf (buffer,
(radix == decimal ? "%lu" : (radix == decimal ? "%lu" :
((radix == octal) ? "0%lo" : "0x%lx")), ((radix == octal) ? "0%lo" : "0x%lx")),
@ -378,6 +406,7 @@ rprint_number (width, num)
bfd_size_type num; bfd_size_type num;
{ {
char buffer[40]; char buffer[40];
sprintf (buffer, sprintf (buffer,
(radix == decimal ? "%lu" : (radix == decimal ? "%lu" :
((radix == octal) ? "0%lo" : "0x%lx")), ((radix == octal) ? "0%lo" : "0x%lx")),
@ -437,6 +466,13 @@ print_berkeley_format (abfd)
total = textsize + datasize + bsssize; total = textsize + datasize + bsssize;
if (show_totals)
{
total_textsize += textsize;
total_datasize += datasize;
total_bsssize += bsssize;
}
rprint_number (7, textsize); rprint_number (7, textsize);
putchar ('\t'); putchar ('\t');
rprint_number (7, datasize); rprint_number (7, datasize);
@ -446,6 +482,7 @@ print_berkeley_format (abfd)
(unsigned long) total, (unsigned long) total); (unsigned long) total, (unsigned long) total);
fputs (bfd_get_filename (abfd), stdout); fputs (bfd_get_filename (abfd), stdout);
if (bfd_my_archive (abfd)) if (bfd_my_archive (abfd))
printf (" (ex %s)", bfd_get_filename (bfd_my_archive (abfd))); printf (" (ex %s)", bfd_get_filename (bfd_my_archive (abfd)));
} }
@ -464,15 +501,18 @@ sysv_internal_sizer (file, sec, ignore)
PTR ignore ATTRIBUTE_UNUSED; PTR ignore ATTRIBUTE_UNUSED;
{ {
bfd_size_type size = bfd_section_size (file, sec); bfd_size_type size = bfd_section_size (file, sec);
if (!bfd_is_abs_section (sec)
&& !bfd_is_com_section (sec) if ( ! bfd_is_abs_section (sec)
&& !bfd_is_und_section (sec)) && ! bfd_is_com_section (sec)
&& ! bfd_is_und_section (sec))
{ {
int namelen = strlen (bfd_section_name (file, sec)); int namelen = strlen (bfd_section_name (file, sec));
if (namelen > svi_namelen) if (namelen > svi_namelen)
svi_namelen = namelen; svi_namelen = namelen;
svi_total += size; svi_total += size;
if (bfd_section_vma (file, sec) > svi_maxvma) if (bfd_section_vma (file, sec) > svi_maxvma)
svi_maxvma = bfd_section_vma (file, sec); svi_maxvma = bfd_section_vma (file, sec);
} }
@ -485,9 +525,10 @@ sysv_internal_printer (file, sec, ignore)
PTR ignore ATTRIBUTE_UNUSED; PTR ignore ATTRIBUTE_UNUSED;
{ {
bfd_size_type size = bfd_section_size (file, sec); bfd_size_type size = bfd_section_size (file, sec);
if (!bfd_is_abs_section (sec)
&& !bfd_is_com_section (sec) if ( ! bfd_is_abs_section (sec)
&& !bfd_is_und_section (sec)) && ! bfd_is_com_section (sec)
&& ! bfd_is_und_section (sec))
{ {
svi_total += size; svi_total += size;
@ -503,12 +544,13 @@ static void
print_sysv_format (file) print_sysv_format (file)
bfd *file; bfd *file;
{ {
/* size all of the columns */ /* Size all of the columns. */
svi_total = 0; svi_total = 0;
svi_maxvma = 0; svi_maxvma = 0;
svi_namelen = 0; svi_namelen = 0;
bfd_map_over_sections (file, sysv_internal_sizer, (PTR) NULL); bfd_map_over_sections (file, sysv_internal_sizer, (PTR) NULL);
svi_vmalen = size_number ((bfd_size_type)svi_maxvma); svi_vmalen = size_number ((bfd_size_type)svi_maxvma);
if ((size_t) svi_vmalen < sizeof ("addr") - 1) if ((size_t) svi_vmalen < sizeof ("addr") - 1)
svi_vmalen = sizeof ("addr")-1; svi_vmalen = sizeof ("addr")-1;
@ -518,11 +560,13 @@ print_sysv_format (file)
svi_total = 0; svi_total = 0;
printf ("%s ", bfd_get_filename (file)); printf ("%s ", bfd_get_filename (file));
if (bfd_my_archive (file)) if (bfd_my_archive (file))
printf (" (ex %s)", bfd_get_filename (bfd_my_archive (file))); printf (" (ex %s)", bfd_get_filename (bfd_my_archive (file)));
printf (":\n%-*s %*s %*s\n", svi_namelen, "section", printf (":\n%-*s %*s %*s\n", svi_namelen, "section",
svi_sizelen, "size", svi_vmalen, "addr"); svi_sizelen, "size", svi_vmalen, "addr");
bfd_map_over_sections (file, sysv_internal_printer, (PTR) NULL); bfd_map_over_sections (file, sysv_internal_printer, (PTR) NULL);
printf ("%-*s ", svi_namelen, "Total"); printf ("%-*s ", svi_namelen, "Total");