/* nm.c -- Describe symbol table of a rel file.
Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
- 2001, 2002
+ 2001, 2002, 2003
Free Software Foundation, Inc.
This file is part of GNU Binutils.
#define SYM_SIZE(sym) \
(sym->elfinfo ? sym->elfinfo->internal_elf_sym.st_size: sym->ssize)
-static void usage PARAMS ((FILE *, int));
-static void set_print_radix PARAMS ((char *));
-static void set_output_format PARAMS ((char *));
-static void display_archive PARAMS ((bfd *));
-static boolean display_file PARAMS ((char *));
-static void display_rel_file PARAMS ((bfd *, bfd *));
-static long filter_symbols PARAMS ((bfd *, boolean, PTR, long, unsigned int));
-static long sort_symbols_by_size PARAMS ((bfd *, boolean, PTR, long, unsigned int, struct size_sym **));
-static void print_symbols PARAMS ((bfd *, boolean, PTR, long, unsigned int, bfd *));
-static void print_size_symbols PARAMS ((bfd *, boolean, struct size_sym *, long, bfd *));
-static void print_symname PARAMS ((const char *, const char *, bfd *));
-static void print_symbol PARAMS ((bfd *, asymbol *, bfd_vma ssize, bfd *));
-static void print_symdef_entry PARAMS ((bfd *));
+static void usage
+ PARAMS ((FILE *, int));
+static void set_print_radix
+ PARAMS ((char *));
+static void set_output_format
+ PARAMS ((char *));
+static void display_archive
+ PARAMS ((bfd *));
+static bfd_boolean display_file
+ PARAMS ((char *));
+static void display_rel_file
+ PARAMS ((bfd *, bfd *));
+static long filter_symbols
+ PARAMS ((bfd *, bfd_boolean, PTR, long, unsigned int));
+static long sort_symbols_by_size
+ PARAMS ((bfd *, bfd_boolean, PTR, long, unsigned int, struct size_sym **));
+static void print_symbols
+ PARAMS ((bfd *, bfd_boolean, PTR, long, unsigned int, bfd *));
+static void print_size_symbols
+ PARAMS ((bfd *, bfd_boolean, struct size_sym *, long, bfd *));
+static void print_symname
+ PARAMS ((const char *, const char *, bfd *));
+static void print_symbol
+ PARAMS ((bfd *, asymbol *, bfd_vma ssize, bfd *));
+static void print_symdef_entry
+ PARAMS ((bfd *));
/* The sorting functions. */
-static int numeric_forward PARAMS ((const PTR, const PTR));
-static int numeric_reverse PARAMS ((const PTR, const PTR));
-static int non_numeric_forward PARAMS ((const PTR, const PTR));
-static int non_numeric_reverse PARAMS ((const PTR, const PTR));
-static int size_forward1 PARAMS ((const PTR, const PTR));
-static int size_forward2 PARAMS ((const PTR, const PTR));
+static int numeric_forward
+ PARAMS ((const PTR, const PTR));
+static int numeric_reverse
+ PARAMS ((const PTR, const PTR));
+static int non_numeric_forward
+ PARAMS ((const PTR, const PTR));
+static int non_numeric_reverse
+ PARAMS ((const PTR, const PTR));
+static int size_forward1
+ PARAMS ((const PTR, const PTR));
+static int size_forward2
+ PARAMS ((const PTR, const PTR));
/* The output formatting functions. */
-static void print_object_filename_bsd PARAMS ((char *));
-static void print_object_filename_sysv PARAMS ((char *));
-static void print_object_filename_posix PARAMS ((char *));
-static void print_archive_filename_bsd PARAMS ((char *));
-static void print_archive_filename_sysv PARAMS ((char *));
-static void print_archive_filename_posix PARAMS ((char *));
-static void print_archive_member_bsd PARAMS ((char *, const char *));
-static void print_archive_member_sysv PARAMS ((char *, const char *));
-static void print_archive_member_posix PARAMS ((char *, const char *));
-static void print_symbol_filename_bsd PARAMS ((bfd *, bfd *));
-static void print_symbol_filename_sysv PARAMS ((bfd *, bfd *));
-static void print_symbol_filename_posix PARAMS ((bfd *, bfd *));
-static void print_value PARAMS ((bfd *, bfd_vma));
-static void print_symbol_info_bsd PARAMS ((struct extended_symbol_info *, bfd *));
-static void print_symbol_info_sysv PARAMS ((struct extended_symbol_info *, bfd *));
-static void print_symbol_info_posix PARAMS ((struct extended_symbol_info *, bfd *));
-static void get_relocs PARAMS ((bfd *, asection *, PTR));
-static const char * get_symbol_type PARAMS ((unsigned int));
+static void print_object_filename_bsd
+ PARAMS ((char *));
+static void print_object_filename_sysv
+ PARAMS ((char *));
+static void print_object_filename_posix
+ PARAMS ((char *));
+static void print_archive_filename_bsd
+ PARAMS ((char *));
+static void print_archive_filename_sysv
+ PARAMS ((char *));
+static void print_archive_filename_posix
+ PARAMS ((char *));
+static void print_archive_member_bsd
+ PARAMS ((char *, const char *));
+static void print_archive_member_sysv
+ PARAMS ((char *, const char *));
+static void print_archive_member_posix
+ PARAMS ((char *, const char *));
+static void print_symbol_filename_bsd
+ PARAMS ((bfd *, bfd *));
+static void print_symbol_filename_sysv
+ PARAMS ((bfd *, bfd *));
+static void print_symbol_filename_posix
+ PARAMS ((bfd *, bfd *));
+static void print_value
+ PARAMS ((bfd *, bfd_vma));
+static void print_symbol_info_bsd
+ PARAMS ((struct extended_symbol_info *, bfd *));
+static void print_symbol_info_sysv
+ PARAMS ((struct extended_symbol_info *, bfd *));
+static void print_symbol_info_posix
+ PARAMS ((struct extended_symbol_info *, bfd *));
+static void get_relocs
+ PARAMS ((bfd *, asection *, PTR));
+static const char * get_symbol_type
+ PARAMS ((unsigned int));
/* Support for different output formats. */
struct output_fns
-B Same as --format=bsd\n\
-C, --demangle[=STYLE] Decode low-level symbol names into user-level names\n\
The STYLE, if specified, can be `auto' (the default),\n\
- `gnu', 'lucid', 'arm', 'hp', 'edg' or 'gnu-v3'\n\
+ `gnu', `lucid', `arm', `hp', `edg', `gnu-v3', `java'\n\
+ or `gnat'\n\
--no-demangle Do not demangle low-level symbol names\n\
-D, --dynamic Display dynamic symbols instead of normal symbols\n\
--defined-only Display only defined symbols\n\
if (show_version)
print_version ("nm");
+ if (sort_by_size && undefined_only)
+ {
+ non_fatal (_("Using the --size-sort and --undefined-only options together"));
+ non_fatal (_("will produce no output, since undefined symbols have no size."));
+ return 0;
+ }
+
/* OK, all options now parsed. If no filename specified, do a.out. */
if (optind == argc)
return !display_file ("a.out");
}
}
-static boolean
+static bfd_boolean
display_file (filename)
char *filename;
{
- boolean retval = true;
+ bfd_boolean retval = TRUE;
bfd *file;
char **matching;
if (file == NULL)
{
bfd_nonfatal (filename);
- return false;
+ return FALSE;
}
if (bfd_check_format (file, bfd_archive))
list_matching_formats (matching);
free (matching);
}
- retval = false;
+ retval = FALSE;
}
- if (bfd_close (file) == false)
+ if (!bfd_close (file))
bfd_fatal (filename);
lineno_cache_bfd = NULL;
/* These globals are used to pass information into the sorting
routines. */
static bfd *sort_bfd;
-static boolean sort_dynamic;
+static bfd_boolean sort_dynamic;
static asymbol *sort_x;
static asymbol *sort_y;
static long
sort_symbols_by_size (abfd, dynamic, minisyms, symcount, size, symsizesp)
bfd *abfd;
- boolean dynamic;
+ bfd_boolean dynamic;
PTR minisyms;
long symcount;
unsigned int size;
if (! dynamic)
{
if (!(bfd_get_file_flags (abfd) & HAS_SYMS))
- return;
+ {
+ non_fatal (_("%s: no symbols"), bfd_get_filename (abfd));
+ return;
+ }
}
symcount = bfd_read_minisymbols (abfd, dynamic, &minisyms, &size);
bfd_fatal (bfd_get_filename (abfd));
if (symcount == 0)
- return;
+ {
+ non_fatal (_("%s: no symbols"), bfd_get_filename (abfd));
+ return;
+ }
/* Discard the symbols we don't want to print.
It's OK to do this in place; we'll free the storage anyway
static long
filter_symbols (abfd, dynamic, minisyms, symcount, size)
bfd *abfd;
- boolean dynamic;
+ bfd_boolean dynamic;
PTR minisyms;
long symcount;
unsigned int size;
static void
print_symbols (abfd, dynamic, minisyms, symcount, size, archive_bfd)
bfd *abfd;
- boolean dynamic;
+ bfd_boolean dynamic;
PTR minisyms;
long symcount;
unsigned int size;
static void
print_size_symbols (abfd, dynamic, symsizes, symcount, archive_bfd)
bfd *abfd;
- boolean dynamic;
+ bfd_boolean dynamic;
struct size_sym *symsizes;
long symcount;
bfd *archive_bfd;
bfd_vma ssize;
bfd *archive_bfd;
{
+ symbol_info syminfo;
+ struct extended_symbol_info info;
+
PROGRESS (1);
(*format->print_symbol_filename) (archive_bfd, abfd);
- if (undefined_only)
- {
- if (bfd_is_und_section (bfd_get_section (sym)))
- print_symname ("%s", bfd_asymbol_name (sym), abfd);
- }
+ bfd_get_symbol_info (abfd, sym, &syminfo);
+ info.sinfo = &syminfo;
+ info.ssize = ssize;
+ if (bfd_get_flavour (abfd) == bfd_target_elf_flavour)
+ info.elfinfo = (elf_symbol_type *) sym;
else
- {
- symbol_info syminfo;
- struct extended_symbol_info info;
-
- bfd_get_symbol_info (abfd, sym, &syminfo);
- info.sinfo = &syminfo;
- info.ssize = ssize;
- if (bfd_get_flavour (abfd) == bfd_target_elf_flavour)
- info.elfinfo = (elf_symbol_type *) sym;
- else
- info.elfinfo = NULL;
- (*format->print_symbol_info) (&info, abfd);
- }
+ info.elfinfo = NULL;
+ (*format->print_symbol_info) (&info, abfd);
if (line_numbers)
{
}
else
{
- print_value (abfd, SYM_VALUE (info));
+ /* Normally we print the value of the symbol. If we are printing the
+ size or sorting by size then we print its size, execpt for the
+ (weird) special case where both flags are defined, in which case we
+ print both values. This conforms to documented behaviour. */
+ if (sort_by_size && !print_size)
+ print_value (abfd, SYM_SIZE (info));
+ else
+ print_value (abfd, SYM_VALUE (info));
if (print_size && SYM_SIZE (info))
{
- printf(" ");
+ printf (" ");
print_value (abfd, SYM_SIZE (info));
}
}
if (SYM_TYPE (info) == '-')
{
/* A stab. */
- printf ("%18s| ", SYM_STAB_NAME (info)); /* (C) Type */
- printf (desc_format, SYM_STAB_DESC (info)); /* Size */
- printf ("| |"); /* Line, Section */
+ printf ("%18s| ", SYM_STAB_NAME (info)); /* (C) Type. */
+ printf (desc_format, SYM_STAB_DESC (info)); /* Size. */
+ printf ("| |"); /* Line, Section. */
}
else
{
{
symindex idx = BFD_NO_MORE_SYMBOLS;
carsym *thesym;
- boolean everprinted = false;
+ bfd_boolean everprinted = FALSE;
for (idx = bfd_get_next_mapent (abfd, idx, &thesym);
idx != BFD_NO_MORE_SYMBOLS;
if (!everprinted)
{
printf (_("\nArchive index:\n"));
- everprinted = true;
+ everprinted = TRUE;
}
elt = bfd_get_elt_at_index (abfd, idx);
if (elt == NULL)