Back to index

cell-binutils  2.17cvs20070401
Defines | Enumerations | Functions | Variables
size.c File Reference
#include "bfd.h"
#include "bucomm.h"
#include "libiberty.h"
#include "getopt.h"

Go to the source code of this file.

Defines

#define BSD_DEFAULT   1

Enumerations

enum  { decimal, octal, hex }

Functions

static void usage (FILE *, int)
static void display_file (char *)
static void display_bfd (bfd *)
static void display_archive (bfd *)
static int size_number (bfd_size_type)
static void rprint_number (int, bfd_size_type)
static void print_berkeley_format (bfd *)
static void sysv_internal_sizer (bfd *, asection *, void *)
static void sysv_internal_printer (bfd *, asection *, void *)
static void print_sysv_format (bfd *)
static void print_sizes (bfd *file)
static void berkeley_sum (bfd *, sec_ptr, void *)
int main (int, char **)
static void berkeley_sum (bfd *abfd ATTRIBUTE_UNUSED, sec_ptr sec, void *ignore ATTRIBUTE_UNUSED)
static void sysv_internal_sizer (bfd *file ATTRIBUTE_UNUSED, sec_ptr sec, void *ignore ATTRIBUTE_UNUSED)
static void sysv_internal_printer (bfd *file ATTRIBUTE_UNUSED, sec_ptr sec, void *ignore ATTRIBUTE_UNUSED)

Variables

enum { ... }  radix
static int berkeley_format = BSD_DEFAULT
int show_version = 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
int return_code = 0
static char * target = NULL
static struct option []
static bfd_size_type bsssize
static bfd_size_type datasize
static bfd_size_type textsize
bfd_size_type svi_total = 0
bfd_vma svi_maxvma = 0
int svi_namelen = 0
int svi_vmalen = 0
int svi_sizelen = 0

Define Documentation

#define BSD_DEFAULT   1

Definition at line 37 of file size.c.


Enumeration Type Documentation

anonymous enum
Enumerator:
decimal 
octal 
hex 

Definition at line 42 of file size.c.

  {
    decimal, octal, hex
  }

Function Documentation

static void berkeley_sum ( bfd ,
sec_ptr  ,
void *   
) [static]

Here is the caller graph for this function:

static void berkeley_sum ( bfd *abfd  ATTRIBUTE_UNUSED,
sec_ptr  sec,
void *ignore  ATTRIBUTE_UNUSED 
) [static]

Definition at line 408 of file size.c.

{
  flagword flags;
  bfd_size_type size;

  flags = bfd_get_section_flags (abfd, sec);
  if ((flags & SEC_ALLOC) == 0)
    return;

  size = bfd_get_section_size (sec);
  if ((flags & SEC_CODE) != 0 || (flags & SEC_READONLY) != 0)
    textsize += size;
  else if ((flags & SEC_HAS_CONTENTS) != 0)
    datasize += size;
  else
    bsssize += size;
}
static void display_archive ( bfd file) [static]

Definition at line 312 of file size.c.

{
  bfd *arfile = (bfd *) NULL;
  bfd *last_arfile = (bfd *) NULL;

  for (;;)
    {
      bfd_set_error (bfd_error_no_error);

      arfile = bfd_openr_next_archived_file (file, arfile);
      if (arfile == NULL)
       {
         if (bfd_get_error () != bfd_error_no_more_archived_files)
           {
             bfd_nonfatal (bfd_get_filename (file));
             return_code = 2;
           }
         break;
       }

      display_bfd (arfile);

      if (last_arfile != NULL)
       bfd_close (last_arfile);
      last_arfile = arfile;
    }

  if (last_arfile != NULL)
    bfd_close (last_arfile);
}

Here is the call graph for this function:

Here is the caller graph for this function:

static void display_bfd ( bfd abfd) [static]

Definition at line 261 of file size.c.

{
  char **matching;

  if (bfd_check_format (abfd, bfd_archive))
    /* An archive within an archive.  */
    return;

  if (bfd_check_format_matches (abfd, bfd_object, &matching))
    {
      print_sizes (abfd);
      printf ("\n");
      return;
    }

  if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
    {
      bfd_nonfatal (bfd_get_filename (abfd));
      list_matching_formats (matching);
      free (matching);
      return_code = 3;
      return;
    }

  if (bfd_check_format_matches (abfd, bfd_core, &matching))
    {
      const char *core_cmd;

      print_sizes (abfd);
      fputs (" (core file", stdout);

      core_cmd = bfd_core_file_failing_command (abfd);
      if (core_cmd)
       printf (" invoked as %s", core_cmd);

      puts (")\n");
      return;
    }

  bfd_nonfatal (bfd_get_filename (abfd));

  if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
    {
      list_matching_formats (matching);
      free (matching);
    }

  return_code = 3;
}

Here is the call graph for this function:

Here is the caller graph for this function:

static void display_file ( char *  filename) [static]

Definition at line 344 of file size.c.

{
  bfd *file;

  if (get_file_size (filename) < 1)
    {
      return_code = 1;
      return;
    }

  file = bfd_openr (filename, target);
  if (file == NULL)
    {
      bfd_nonfatal (filename);
      return_code = 1;
      return;
    }

  if (bfd_check_format (file, bfd_archive))
    display_archive (file);
  else
    display_bfd (file);

  if (!bfd_close (file))
    {
      bfd_nonfatal (filename);
      return_code = 1;
      return;
    }
}

Here is the call graph for this function:

int main ( int  argc,
char **  argv 
)
static void print_berkeley_format ( bfd abfd) [static]

Definition at line 428 of file size.c.

{
  static int files_seen = 0;
  bfd_size_type total;

  bsssize = 0;
  datasize = 0;
  textsize = 0;

  bfd_map_over_sections (abfd, berkeley_sum, NULL);

  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");

  total = textsize + datasize + bsssize;

  if (show_totals)
    {
      total_textsize += textsize;
      total_datasize += datasize;
      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);

  fputs (bfd_get_filename (abfd), stdout);

  if (bfd_my_archive (abfd))
    printf (" (ex %s)", bfd_get_filename (bfd_my_archive (abfd)));
}

Here is the call graph for this function:

Here is the caller graph for this function:

static void print_sizes ( bfd file) [static]

Definition at line 549 of file size.c.

Here is the call graph for this function:

Here is the caller graph for this function:

static void print_sysv_format ( bfd file) [static]

Definition at line 516 of file size.c.

{
  /* Size all of the columns.  */
  svi_total = 0;
  svi_maxvma = 0;
  svi_namelen = 0;
  bfd_map_over_sections (file, sysv_internal_sizer, 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)));

  printf (":\n%-*s   %*s   %*s\n", svi_namelen, "section",
         svi_sizelen, "size", svi_vmalen, "addr");

  bfd_map_over_sections (file, sysv_internal_printer, NULL);

  printf ("%-*s   ", svi_namelen, "Total");
  rprint_number (svi_sizelen, svi_total);
  printf ("\n\n");
}

Here is the call graph for this function:

Here is the caller graph for this function:

static void rprint_number ( int  width,
bfd_size_type  num 
) [static]

Definition at line 391 of file size.c.

{
  char buffer[40];

  sprintf (buffer,
          (radix == decimal ? "%lu" :
          ((radix == octal) ? "0%lo" : "0x%lx")),
          (unsigned long) num);

  printf ("%*s", width, buffer);
}

Here is the call graph for this function:

Here is the caller graph for this function:

static int size_number ( bfd_size_type  num) [static]

Definition at line 378 of file size.c.

{
  char buffer[40];

  sprintf (buffer,
          (radix == decimal ? "%lu" :
          ((radix == octal) ? "0%lo" : "0x%lx")),
          (unsigned long) num);

  return strlen (buffer);
}

Here is the call graph for this function:

Here is the caller graph for this function:

static void sysv_internal_printer ( bfd ,
asection ,
void *   
) [static]

Here is the caller graph for this function:

static void sysv_internal_printer ( bfd *file  ATTRIBUTE_UNUSED,
sec_ptr  sec,
void *ignore  ATTRIBUTE_UNUSED 
) [static]

Definition at line 496 of file size.c.

{
  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))
    {
      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");
    }
}

Here is the call graph for this function:

static void sysv_internal_sizer ( bfd ,
asection ,
void *   
) [static]

Here is the caller graph for this function:

static void sysv_internal_sizer ( bfd *file  ATTRIBUTE_UNUSED,
sec_ptr  sec,
void *ignore  ATTRIBUTE_UNUSED 
) [static]

Definition at line 474 of file size.c.

{
  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);
    }
}

Here is the call graph for this function:

static void usage ( FILE *  stream,
int  status 
) [static]

Definition at line 80 of file size.c.

{
  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\
  -o|-d|-x  --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\
            @<file>                   Read options from <file>\n\
  -h        --help                    Display this information\n\
  -v        --version                 Display the program's version\n\
\n"),
#if BSD_DEFAULT
  "berkeley"
#else
  "sysv"
#endif
);
  list_supported_targets (program_name, stream);
  if (REPORT_BUGS_TO[0] && status == 0)
    fprintf (stream, _("Report bugs to %s\n"), REPORT_BUGS_TO);
  exit (status);
}

Here is the call graph for this function:


Variable Documentation

Definition at line 49 of file size.c.

Definition at line 403 of file size.c.

Definition at line 404 of file size.c.

struct option[] [static]
Initial value:
{
  {"format", required_argument, 0, 200},
  {"radix", required_argument, 0, 201},
  {"target", required_argument, 0, 202},
  {"totals", no_argument, &show_totals, 1},
  {"version", no_argument, &show_version, 1},
  {"help", no_argument, &show_help, 1},
  {0, no_argument, 0, 0}
}

Definition at line 106 of file size.c.

enum { ... } radix

Definition at line 60 of file size.c.

Definition at line 52 of file size.c.

Definition at line 53 of file size.c.

Definition at line 51 of file size.c.

Definition at line 468 of file size.c.

Definition at line 469 of file size.c.

Definition at line 471 of file size.c.

Definition at line 467 of file size.c.

Definition at line 470 of file size.c.

char* target = NULL [static]

Definition at line 62 of file size.c.

Definition at line 405 of file size.c.

Definition at line 55 of file size.c.

Definition at line 56 of file size.c.

Definition at line 57 of file size.c.