diff options
Diffstat (limited to 'binutils/size.c')
-rw-r--r-- | binutils/size.c | 194 |
1 files changed, 138 insertions, 56 deletions
diff --git a/binutils/size.c b/binutils/size.c index 175e3ff..4ed3555 100644 --- a/binutils/size.c +++ b/binutils/size.c @@ -1,5 +1,5 @@ /* size.c -- report size of various sections of an executable file. - Copyright 1991, 92, 93, 94 Free Software Foundation, Inc. + Copyright 1991, 92, 93, 94, 95, 96, 97, 1998 Free Software Foundation, Inc. This file is part of GNU Binutils. @@ -15,7 +15,7 @@ GNU General Public License for more details. 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* Extensions/incompatibilities: o - BSD output has filenames at the end. @@ -29,9 +29,9 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ */ #include "bfd.h" -#include "sysdep.h" #include "getopt.h" #include "bucomm.h" +#include "libiberty.h" #ifndef BSD_DEFAULT #define BSD_DEFAULT 1 @@ -50,31 +50,42 @@ int show_help = 0; /* Program exit status. */ int return_code = 0; -/* IMPORTS */ -extern char *program_version; -extern char *target; +static char *target = NULL; -/* Forward declarations */ +/* Static declarations */ +static void usage PARAMS ((FILE *, int)); static void display_file PARAMS ((char *filename)); - +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)); -void +static void usage (stream, status) FILE *stream; int status; { - fprintf (stream, "\ + fprintf (stream, _("\ Usage: %s [-ABdoxV] [--format=berkeley|sysv] [--radix=8|10|16]\n\ - [--target=bfdname] [--version] [--help] [file...]\n", program_name); + [--target=bfdname] [--version] [--help] [file...]\n"), program_name); #if BSD_DEFAULT - fputs ("default is --format=berkeley\n", stream); + fputs (_("default is --format=berkeley\n"), stream); #else - fputs ("default is --format=sysv\n", stream); + fputs (_("default is --format=sysv\n"), stream); #endif + list_supported_targets (program_name, stream); + if (status == 0) + fprintf (stream, _("Report bugs to bug-gnu-utils@gnu.org\n")); exit (status); } @@ -97,8 +108,10 @@ main (argc, argv) int c; program_name = *argv; + xmalloc_set_program_name (program_name); bfd_init (); + set_default_bfd_target (); while ((c = getopt_long (argc, argv, "ABVdox", long_options, (int *) 0)) != EOF) @@ -116,7 +129,7 @@ main (argc, argv) berkeley_format = 0; break; default: - fprintf (stderr, "invalid argument to --format: %s\n", optarg); + fprintf (stderr, _("invalid argument to --format: %s\n"), optarg); usage (stderr, 1); } break; @@ -143,7 +156,7 @@ main (argc, argv) radix = hex; break; default: - printf ("Invalid radix: %s\n", optarg); + printf (_("Invalid radix: %s\n"), optarg); usage (stderr, 1); } break; @@ -173,10 +186,7 @@ main (argc, argv) } if (show_version) - { - printf ("GNU %s version %s\n", program_name, program_version); - exit (0); - } + print_version ("size"); if (show_help) usage (stdout, 0); @@ -191,7 +201,7 @@ main (argc, argv) /* Display stats on file or archive member ABFD. */ -void +static void display_bfd (abfd) bfd *abfd; { @@ -208,7 +218,7 @@ display_bfd (abfd) return; } - if (bfd_error == file_ambiguously_recognized) + if (bfd_get_error () == bfd_error_file_ambiguously_recognized) { bfd_nonfatal (bfd_get_filename (abfd)); list_matching_formats (matching); @@ -234,7 +244,7 @@ display_bfd (abfd) bfd_nonfatal (bfd_get_filename (abfd)); - if (bfd_error == file_ambiguously_recognized) + if (bfd_get_error () == bfd_error_file_ambiguously_recognized) { list_matching_formats (matching); free (matching); @@ -251,12 +261,12 @@ display_archive (file) for (;;) { - bfd_error = no_error; + bfd_set_error (bfd_error_no_error); arfile = bfd_openr_next_archived_file (file, arfile); if (arfile == NULL) { - if (bfd_error != no_more_archived_files) + if (bfd_get_error () != bfd_error_no_more_archived_files) { bfd_nonfatal (bfd_get_filename (file)); return_code = 2; @@ -296,24 +306,51 @@ display_file (filename) /* This is what lexical functions are for. */ -void +static int +size_number (num) + bfd_size_type num; +{ + char buffer[40]; + sprintf (buffer, + (radix == decimal ? "%lu" : + ((radix == octal) ? "0%lo" : "0x%lx")), + (unsigned long) num); + + return strlen (buffer); +} + +#if 0 + +/* This is not used. */ + +static void lprint_number (width, num) int width; bfd_size_type num; { - printf ((radix == decimal ? "%-*lu\t" : - ((radix == octal) ? "%-*lo\t" : "%-*lx\t")), - width, (unsigned long) num); + char buffer[40]; + sprintf (buffer, + (radix == decimal ? "%lu" : + ((radix == octal) ? "0%lo" : "0x%lx")), + (unsigned long) num); + + printf ("%-*s", width, buffer); } -void +#endif + +static void rprint_number (width, num) int width; bfd_size_type num; { - printf ((radix == decimal ? "%*lu\t" : - ((radix == octal) ? "%*lo\t" : "%*lx\t")), - width, (unsigned long) num); + char buffer[40]; + sprintf (buffer, + (radix == decimal ? "%lu" : + ((radix == octal) ? "0%lo" : "0x%lx")), + (unsigned long) num); + + printf ("%*s", width, buffer); } static bfd_size_type bsssize; @@ -326,18 +363,23 @@ berkeley_sum (abfd, sec, ignore) sec_ptr sec; PTR ignore; { + flagword flags; bfd_size_type size; + flags = bfd_get_section_flags (abfd, sec); + if ((flags & SEC_ALLOC) == 0) + return; + size = bfd_get_section_size_before_reloc (sec); - if (bfd_get_section_flags (abfd, sec) & SEC_CODE) + if ((flags & SEC_CODE) != 0 || (flags & SEC_READONLY) != 0) textsize += size; - else if (bfd_get_section_flags (abfd, sec) & SEC_DATA) + else if ((flags & SEC_HAS_CONTENTS) != 0) datasize += size; - else if (bfd_get_section_flags (abfd, sec) & SEC_ALLOC) + else bsssize += size; } -void +static void print_berkeley_format (abfd) bfd *abfd; { @@ -353,19 +395,21 @@ print_berkeley_format (abfd) if (files_seen++ == 0) #if 0 /* Intel doesn't like bss/stk because they don't have core files. */ - puts ((radix == octal) ? "text\tdata\tbss/stk\toct\thex\tfilename" : - "text\tdata\tbss/stk\tdec\thex\tfilename"); + 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\tdata\tbss\toct\thex\tfilename" : - "text\tdata\tbss\tdec\thex\tfilename"); + puts ((radix == octal) ? " text\t data\t bss\t oct\t hex\tfilename" : + " text\t data\t bss\t dec\t hex\tfilename"); #endif total = textsize + datasize + bsssize; - lprint_number (7, textsize); - lprint_number (7, datasize); - lprint_number (7, bsssize); - printf (((radix == octal) ? "%-7lo\t%-7lx\t" : "%-7lu\t%-7lx\t"), + 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); fputs (bfd_get_filename (abfd), stdout); @@ -375,43 +419,81 @@ print_berkeley_format (abfd) /* I REALLY miss lexical functions! */ bfd_size_type svi_total = 0; +bfd_vma svi_maxvma = 0; +int svi_namelen = 0; +int svi_vmalen = 0; +int svi_sizelen = 0; -void +static void +sysv_internal_sizer (file, sec, ignore) + bfd *file; + sec_ptr sec; + PTR ignore; +{ + bfd_size_type size = bfd_section_size (file, 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)); + 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); + } +} + +static void sysv_internal_printer (file, sec, ignore) bfd *file; sec_ptr sec; PTR ignore; { bfd_size_type size = bfd_section_size (file, sec); - if (sec != &bfd_abs_section + if (!bfd_is_abs_section (sec) && !bfd_is_com_section (sec) - && sec != &bfd_und_section) + && !bfd_is_und_section (sec)) { svi_total += size; - printf ("%-12s", bfd_section_name (file, sec)); - rprint_number (8, size); - printf (" "); - rprint_number (8, bfd_section_vma (file, sec)); + 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"); } } -void +static void print_sysv_format (file) bfd *file; { + /* size all of the columns */ svi_total = 0; + svi_maxvma = 0; + svi_namelen = 0; + bfd_map_over_sections (file, sysv_internal_sizer, (PTR) NULL); + svi_vmalen = size_number ((bfd_size_type)svi_maxvma); + if ((size_t) svi_vmalen < sizeof ("addr") - 1) + svi_vmalen = sizeof ("addr")-1; + svi_sizelen = size_number (svi_total); + if ((size_t) svi_sizelen < sizeof ("size") - 1) + svi_sizelen = sizeof ("size")-1; + + svi_total = 0; printf ("%s ", bfd_get_filename (file)); if (bfd_my_archive (file)) printf (" (ex %s)", bfd_get_filename (bfd_my_archive (file))); - puts (":\nsection\t\tsize\t 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); - printf ("Total "); - rprint_number (8, svi_total); + printf ("%-*s ", svi_namelen, "Total"); + rprint_number (svi_sizelen, svi_total); printf ("\n\n"); } |