aboutsummaryrefslogtreecommitdiff
path: root/binutils/size.c
diff options
context:
space:
mode:
Diffstat (limited to 'binutils/size.c')
-rw-r--r--binutils/size.c110
1 files changed, 76 insertions, 34 deletions
diff --git a/binutils/size.c b/binutils/size.c
index 93ec026..479a464 100644
--- a/binutils/size.c
+++ b/binutils/size.c
@@ -46,8 +46,20 @@ static enum
}
radix = decimal;
-/* 0 means use AT&T-style output. */
-static int berkeley_format = BSD_DEFAULT;
+/* 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;
@@ -77,7 +89,7 @@ usage (FILE *stream, int status)
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\
--common Display total size for *COM* syms\n\
@@ -141,7 +153,7 @@ main (int argc, char **argv)
fatal (_("fatal error: libbfd ABI mismatch"));
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)
{
@@ -150,11 +162,15 @@ main (int argc, char **argv)
{
case 'B':
case 'b':
- berkeley_format = 1;
+ selected_output_format = FORMAT_BERKLEY;
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);
@@ -190,10 +206,13 @@ main (int argc, char **argv)
break;
case 'A':
- berkeley_format = 0;
+ selected_output_format = FORMAT_SYSV;
break;
case 'B':
- berkeley_format = 1;
+ selected_output_format = FORMAT_BERKLEY;
+ break;
+ case 'G':
+ selected_output_format = FORMAT_GNU;
break;
case 'v':
case 'V':
@@ -240,17 +259,25 @@ main (int argc, char **argv)
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;
-
- 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);
}
@@ -445,8 +472,8 @@ static bfd_size_type datasize;
static bfd_size_type textsize;
static void
-berkeley_sum (bfd *abfd ATTRIBUTE_UNUSED, sec_ptr sec,
- void *ignore ATTRIBUTE_UNUSED)
+berkeley_or_gnu_sum (bfd *abfd ATTRIBUTE_UNUSED, sec_ptr sec,
+ void *ignore ATTRIBUTE_UNUSED)
{
flagword flags;
bfd_size_type size;
@@ -456,7 +483,9 @@ berkeley_sum (bfd *abfd ATTRIBUTE_UNUSED, sec_ptr sec,
return;
size = bfd_get_section_size (sec);
- if ((flags & SEC_CODE) != 0 || (flags & SEC_READONLY) != 0)
+ 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;
@@ -465,21 +494,28 @@ berkeley_sum (bfd *abfd ATTRIBUTE_UNUSED, sec_ptr sec,
}
static void
-print_berkeley_format (bfd *abfd)
+print_berkeley_or_gnu_format (bfd *abfd)
{
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;
- bfd_map_over_sections (abfd, berkeley_sum, NULL);
+ bfd_map_over_sections (abfd, berkeley_or_gnu_sum, NULL);
bsssize += common_size;
if (files_seen++ == 0)
- puts ((radix == octal) ? " text\t data\t bss\t oct\t hex\tfilename" :
- " text\t data\t bss\t dec\t hex\tfilename");
+ {
+ 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;
@@ -490,14 +526,20 @@ print_berkeley_format (bfd *abfd)
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);
if (abfd->my_archive)
@@ -611,8 +653,8 @@ print_sizes (bfd *file)
{
if (show_common)
calculate_common_size (file);
- if (berkeley_format)
- print_berkeley_format (file);
- else
+ if (selected_output_format == FORMAT_SYSV)
print_sysv_format (file);
+ else
+ print_berkeley_or_gnu_format (file);
}