1 /* nm.c -- Describe symbol table of a rel file.
2 Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
4 Free Software Foundation, Inc.
6 This file is part of GNU Binutils.
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
27 #include "aout/stab_gnu.h"
28 #include "aout/ranlib.h"
30 #include "libiberty.h"
32 /* When sorting by size, we use this structure to hold the size and a
33 pointer to the minisymbol. */
41 /* When fetching relocs, we use this structure to pass information to
44 struct get_relocs_info
53 usage PARAMS ((FILE *, int));
56 set_print_radix PARAMS ((char *));
59 set_output_format PARAMS ((char *));
62 display_archive PARAMS ((bfd *));
65 display_file PARAMS ((char *filename));
68 display_rel_file PARAMS ((bfd * file, bfd * archive));
71 filter_symbols PARAMS ((bfd *, boolean, PTR, long, unsigned int));
74 sort_symbols_by_size PARAMS ((bfd *, boolean, PTR, long, unsigned int,
78 print_symbols PARAMS ((bfd *, boolean, PTR, long, unsigned int, bfd *));
81 print_size_symbols PARAMS ((bfd *, boolean, struct size_sym *, long, bfd *));
84 print_symname PARAMS ((const char *, const char *, bfd *));
87 print_symbol PARAMS ((bfd *, asymbol *, bfd *));
90 print_symdef_entry PARAMS ((bfd * abfd));
92 /* The sorting functions. */
95 numeric_forward PARAMS ((const PTR, const PTR));
98 numeric_reverse PARAMS ((const PTR, const PTR));
101 non_numeric_forward PARAMS ((const PTR, const PTR));
104 non_numeric_reverse PARAMS ((const PTR, const PTR));
107 size_forward1 PARAMS ((const PTR, const PTR));
110 size_forward2 PARAMS ((const PTR, const PTR));
112 /* The output formatting functions. */
115 print_object_filename_bsd PARAMS ((char *filename));
118 print_object_filename_sysv PARAMS ((char *filename));
121 print_object_filename_posix PARAMS ((char *filename));
125 print_archive_filename_bsd PARAMS ((char *filename));
128 print_archive_filename_sysv PARAMS ((char *filename));
131 print_archive_filename_posix PARAMS ((char *filename));
135 print_archive_member_bsd PARAMS ((char *archive, CONST char *filename));
138 print_archive_member_sysv PARAMS ((char *archive, CONST char *filename));
141 print_archive_member_posix PARAMS ((char *archive, CONST char *filename));
145 print_symbol_filename_bsd PARAMS ((bfd * archive_bfd, bfd * abfd));
148 print_symbol_filename_sysv PARAMS ((bfd * archive_bfd, bfd * abfd));
151 print_symbol_filename_posix PARAMS ((bfd * archive_bfd, bfd * abfd));
155 print_value PARAMS ((bfd *, bfd_vma));
158 print_symbol_info_bsd PARAMS ((symbol_info * info, bfd * abfd));
161 print_symbol_info_sysv PARAMS ((symbol_info * info, bfd * abfd));
164 print_symbol_info_posix PARAMS ((symbol_info * info, bfd * abfd));
167 get_relocs PARAMS ((bfd *, asection *, PTR));
169 /* Support for different output formats. */
172 /* Print the name of an object file given on the command line. */
173 void (*print_object_filename) PARAMS ((char *filename));
175 /* Print the name of an archive file given on the command line. */
176 void (*print_archive_filename) PARAMS ((char *filename));
178 /* Print the name of an archive member file. */
179 void (*print_archive_member) PARAMS ((char *archive, CONST char *filename));
181 /* Print the name of the file (and archive, if there is one)
182 containing a symbol. */
183 void (*print_symbol_filename) PARAMS ((bfd * archive_bfd, bfd * abfd));
185 /* Print a line of information about a symbol. */
186 void (*print_symbol_info) PARAMS ((symbol_info * info, bfd * abfd));
188 static struct output_fns formats[] =
190 {print_object_filename_bsd,
191 print_archive_filename_bsd,
192 print_archive_member_bsd,
193 print_symbol_filename_bsd,
194 print_symbol_info_bsd},
195 {print_object_filename_sysv,
196 print_archive_filename_sysv,
197 print_archive_member_sysv,
198 print_symbol_filename_sysv,
199 print_symbol_info_sysv},
200 {print_object_filename_posix,
201 print_archive_filename_posix,
202 print_archive_member_posix,
203 print_symbol_filename_posix,
204 print_symbol_info_posix}
207 /* Indices in `formats'. */
209 #define FORMAT_SYSV 1
210 #define FORMAT_POSIX 2
211 #define FORMAT_DEFAULT FORMAT_BSD
213 /* The output format to use. */
214 static struct output_fns *format = &formats[FORMAT_DEFAULT];
217 /* Command options. */
219 static int do_demangle = 0; /* Pretty print C++ symbol names. */
220 static int external_only = 0; /* print external symbols only */
221 static int defined_only = 0; /* Print defined symbols only */
222 static int no_sort = 0; /* don't sort; print syms in order found */
223 static int print_debug_syms = 0; /* print debugger-only symbols too */
224 static int print_armap = 0; /* describe __.SYMDEF data in archive files. */
225 static int reverse_sort = 0; /* sort in downward(alpha or numeric) order */
226 static int sort_numerically = 0; /* sort in numeric rather than alpha order */
227 static int sort_by_size = 0; /* sort by size of symbol */
228 static int undefined_only = 0; /* print undefined symbols only */
229 static int dynamic = 0; /* print dynamic symbols. */
230 static int show_version = 0; /* show the version number */
231 static int show_stats = 0; /* show statistics */
232 static int line_numbers = 0; /* print line numbers for symbols */
234 /* When to print the names of files. Not mutually exclusive in SYSV format. */
235 static int filename_per_file = 0; /* Once per file, on its own line. */
236 static int filename_per_symbol = 0; /* Once per symbol, at start of line. */
238 /* Print formats for printing a symbol value. */
240 static char value_format[] = "%08lx";
242 #if BFD_HOST_64BIT_LONG
243 static char value_format[] = "%016lx";
245 /* We don't use value_format for this case. */
249 static int print_width = 16;
251 static int print_width = 8;
253 static int print_radix = 16;
254 /* Print formats for printing stab info. */
255 static char other_format[] = "%02x";
256 static char desc_format[] = "%04x";
258 static char *target = NULL;
260 /* Used to cache the line numbers for a BFD. */
261 static bfd *lineno_cache_bfd;
262 static bfd *lineno_cache_rel_bfd;
264 #define OPTION_TARGET 200
266 static struct option long_options[] =
268 {"debug-syms", no_argument, &print_debug_syms, 1},
269 {"demangle", optional_argument, 0, 'C'},
270 {"dynamic", no_argument, &dynamic, 1},
271 {"extern-only", no_argument, &external_only, 1},
272 {"format", required_argument, 0, 'f'},
273 {"help", no_argument, 0, 'h'},
274 {"line-numbers", no_argument, 0, 'l'},
275 {"no-cplus", no_argument, &do_demangle, 0}, /* Linux compatibility. */
276 {"no-demangle", no_argument, &do_demangle, 0},
277 {"no-sort", no_argument, &no_sort, 1},
278 {"numeric-sort", no_argument, &sort_numerically, 1},
279 {"portability", no_argument, 0, 'P'},
280 {"print-armap", no_argument, &print_armap, 1},
281 {"print-file-name", no_argument, 0, 'o'},
282 {"radix", required_argument, 0, 't'},
283 {"reverse-sort", no_argument, &reverse_sort, 1},
284 {"size-sort", no_argument, &sort_by_size, 1},
285 {"stats", no_argument, &show_stats, 1},
286 {"target", required_argument, 0, OPTION_TARGET},
287 {"defined-only", no_argument, &defined_only, 1},
288 {"undefined-only", no_argument, &undefined_only, 1},
289 {"version", no_argument, &show_version, 1},
290 {0, no_argument, 0, 0}
293 /* Some error-reporting functions */
296 usage (stream, status)
300 fprintf (stream, _("Usage: %s [OPTION]... [FILE]...\n"), program_name);
301 fprintf (stream, _("List symbols from FILEs (a.out by default).\n"));
302 fprintf (stream, _("\n\
303 -a, --debug-syms Display debugger-only symbols\n\
304 -A, --print-file-name Print name of the input file before every symbol\n\
305 -B Same as --format=bsd\n\
306 -C, --demangle[=STYLE] Decode low-level symbol names into user-level names\n\
307 The STYLE, if specified, can be `auto' (the default),\n\
308 `gnu', 'lucid', 'arm', 'hp', 'edg' or 'gnu-new-abi'\n\
309 --no-demangle Do not demangle low-level symbol names\n\
310 -D, --dynamic Display dynamic symbols instead of normal symbols\n\
311 --defined-only Display only defined symbols\n\
313 -f, --format=FORMAT Use the output format FORMAT. FORMAT can be `bsd',\n\
314 `sysv' or `posix'. The default is `bsd'\n\
315 -g, --extern-only Display only external symbols\n\
316 -h, --help Display this information\n\
317 -l, --line-numbers Use debugging information to find a filename and\n\
318 line number for each symbol\n\
319 -n, --numeric-sort Sort symbols numerically by address\n\
321 -p, --no-sort Do not sort the symbols\n\
322 -P, --portability Same as --format=posix\n\
323 -r, --reverse-sort Reverse the sense of the sort\n\
324 -s, --print-armap Include index for symbols from archive members\n\
325 --size-sort Sort symbols by size\n\
326 -t, --radix=RADIX Use RADIX for printing symbol values\n\
327 --target=BFDNAME Specify the target object format as BFDNAME\n\
328 -u, --undefined-only Display only undefined symbols\n\
329 -V, --version Display this program's version number\n\
330 -X 32_64 (ignored)\n\
332 list_supported_targets (program_name, stream);
334 fprintf (stream, _("Report bugs to %s.\n"), REPORT_BUGS_TO);
338 /* Set the radix for the symbol value and size according to RADIX. */
341 set_print_radix (radix)
355 value_format[4] = *radix;
357 #if BFD_HOST_64BIT_LONG
358 value_format[5] = *radix;
360 /* This case requires special handling for octal and decimal
364 other_format[3] = desc_format[3] = *radix;
367 fatal (_("%s: invalid radix"), radix);
372 set_output_format (f)
392 fatal (_("%s: invalid output format"), f);
394 format = &formats[i];
397 int main PARAMS ((int, char **));
407 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
408 setlocale (LC_MESSAGES, "");
410 #if defined (HAVE_SETLOCALE)
411 setlocale (LC_CTYPE, "");
413 bindtextdomain (PACKAGE, LOCALEDIR);
414 textdomain (PACKAGE);
416 program_name = *argv;
417 xmalloc_set_program_name (program_name);
419 START_PROGRESS (program_name, 0);
422 set_default_bfd_target ();
424 while ((c = getopt_long (argc, argv, "aABCDef:glnopPrst:uvVX:",
425 long_options, (int *) 0)) != EOF)
430 print_debug_syms = 1;
434 filename_per_symbol = 1;
436 case 'B': /* For MIPS compatibility. */
437 set_output_format ("bsd");
443 enum demangling_styles style;
445 style = cplus_demangle_name_to_style (optarg);
446 if (style == unknown_demangling)
447 fatal (_("unknown demangling style `%s'"),
450 cplus_demangle_set_style (style);
457 /* Ignored for HP/UX compatibility. */
460 set_output_format (optarg);
472 sort_numerically = 1;
478 set_output_format ("posix");
487 set_print_radix (optarg);
496 /* Ignored for (partial) AIX compatibility. On AIX, the
497 argument has values 32, 64, or 32_64, and specfies that
498 only 32-bit, only 64-bit, or both kinds of objects should
499 be examined. The default is 32. So plain AIX nm on a
500 library archive with both kinds of objects will ignore
501 the 64-bit ones. For GNU nm, the default is and always
502 has been -X 32_64, and other options are not supported. */
503 if (strcmp (optarg, "32_64") != 0)
504 fatal (_("Only -X 32_64 is supported"));
507 case OPTION_TARGET: /* --target */
511 case 0: /* A long option that just sets a flag. */
520 print_version ("nm");
522 /* OK, all options now parsed. If no filename specified, do a.out. */
524 return !display_file ("a.out");
528 if (argc - optind > 1)
529 filename_per_file = 1;
531 /* We were given several filenames to do. */
532 while (optind < argc)
535 if (!display_file (argv[optind++]))
539 END_PROGRESS (program_name);
544 char *lim = (char *) sbrk (0);
546 non_fatal (_("data size %ld"), (long) (lim - (char *) &environ));
555 display_archive (file)
559 bfd *last_arfile = NULL;
562 (*format->print_archive_filename) (bfd_get_filename (file));
565 print_symdef_entry (file);
571 arfile = bfd_openr_next_archived_file (file, arfile);
575 if (bfd_get_error () != bfd_error_no_more_archived_files)
576 bfd_fatal (bfd_get_filename (file));
580 if (bfd_check_format_matches (arfile, bfd_object, &matching))
582 (*format->print_archive_member) (bfd_get_filename (file),
583 bfd_get_filename (arfile));
584 display_rel_file (arfile, file);
588 bfd_nonfatal (bfd_get_filename (arfile));
589 if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
591 list_matching_formats (matching);
596 if (last_arfile != NULL)
598 bfd_close (last_arfile);
599 lineno_cache_bfd = NULL;
600 lineno_cache_rel_bfd = NULL;
602 last_arfile = arfile;
605 if (last_arfile != NULL)
607 bfd_close (last_arfile);
608 lineno_cache_bfd = NULL;
609 lineno_cache_rel_bfd = NULL;
614 display_file (filename)
617 boolean retval = true;
621 file = bfd_openr (filename, target);
624 bfd_nonfatal (filename);
628 if (bfd_check_format (file, bfd_archive))
630 display_archive (file);
632 else if (bfd_check_format_matches (file, bfd_object, &matching))
634 (*format->print_object_filename) (filename);
635 display_rel_file (file, NULL);
639 bfd_nonfatal (filename);
640 if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
642 list_matching_formats (matching);
648 if (bfd_close (file) == false)
649 bfd_fatal (filename);
651 lineno_cache_bfd = NULL;
652 lineno_cache_rel_bfd = NULL;
657 /* These globals are used to pass information into the sorting
659 static bfd *sort_bfd;
660 static boolean sort_dynamic;
661 static asymbol *sort_x;
662 static asymbol *sort_y;
664 /* Symbol-sorting predicates */
665 #define valueof(x) ((x)->section->vma + (x)->value)
667 /* Numeric sorts. Undefined symbols are always considered "less than"
668 defined symbols with zero values. Common symbols are not treated
669 specially -- i.e., their sizes are used as their "values". */
672 numeric_forward (P_x, P_y)
679 x = bfd_minisymbol_to_symbol (sort_bfd, sort_dynamic, P_x, sort_x);
680 y = bfd_minisymbol_to_symbol (sort_bfd, sort_dynamic, P_y, sort_y);
681 if (x == NULL || y == NULL)
682 bfd_fatal (bfd_get_filename (sort_bfd));
684 xs = bfd_get_section (x);
685 ys = bfd_get_section (y);
687 if (bfd_is_und_section (xs))
689 if (! bfd_is_und_section (ys))
692 else if (bfd_is_und_section (ys))
694 else if (valueof (x) != valueof (y))
695 return valueof (x) < valueof (y) ? -1 : 1;
697 return non_numeric_forward (P_x, P_y);
701 numeric_reverse (x, y)
705 return - numeric_forward (x, y);
709 non_numeric_forward (P_x, P_y)
716 x = bfd_minisymbol_to_symbol (sort_bfd, sort_dynamic, P_x, sort_x);
717 y = bfd_minisymbol_to_symbol (sort_bfd, sort_dynamic, P_y, sort_y);
718 if (x == NULL || y == NULL)
719 bfd_fatal (bfd_get_filename (sort_bfd));
721 xn = bfd_asymbol_name (x);
722 yn = bfd_asymbol_name (y);
724 return ((xn == NULL) ? ((yn == NULL) ? 0 : -1) :
725 ((yn == NULL) ? 1 : strcmp (xn, yn)));
729 non_numeric_reverse (x, y)
733 return - non_numeric_forward (x, y);
736 static int (*(sorters[2][2])) PARAMS ((const PTR, const PTR)) =
738 { non_numeric_forward, non_numeric_reverse },
739 { numeric_forward, numeric_reverse }
742 /* This sort routine is used by sort_symbols_by_size. It is similar
743 to numeric_forward, but when symbols have the same value it sorts
744 by section VMA. This simplifies the sort_symbols_by_size code
745 which handles symbols at the end of sections. Also, this routine
746 tries to sort file names before other symbols with the same value.
747 That will make the file name have a zero size, which will make
748 sort_symbols_by_size choose the non file name symbol, leading to
749 more meaningful output. For similar reasons, this code sorts
750 gnu_compiled_* and gcc2_compiled before other symbols with the same
754 size_forward1 (P_x, P_y)
764 x = bfd_minisymbol_to_symbol (sort_bfd, sort_dynamic, P_x, sort_x);
765 y = bfd_minisymbol_to_symbol (sort_bfd, sort_dynamic, P_y, sort_y);
766 if (x == NULL || y == NULL)
767 bfd_fatal (bfd_get_filename (sort_bfd));
769 xs = bfd_get_section (x);
770 ys = bfd_get_section (y);
772 if (bfd_is_und_section (xs))
774 if (bfd_is_und_section (ys))
777 if (valueof (x) != valueof (y))
778 return valueof (x) < valueof (y) ? -1 : 1;
780 if (xs->vma != ys->vma)
781 return xs->vma < ys->vma ? -1 : 1;
783 xn = bfd_asymbol_name (x);
784 yn = bfd_asymbol_name (y);
788 /* The symbols gnu_compiled and gcc2_compiled convey even less
789 information than the file name, so sort them out first. */
791 xf = (strstr (xn, "gnu_compiled") != NULL
792 || strstr (xn, "gcc2_compiled") != NULL);
793 yf = (strstr (yn, "gnu_compiled") != NULL
794 || strstr (yn, "gcc2_compiled") != NULL);
801 /* We use a heuristic for the file name. It may not work on non
802 Unix systems, but it doesn't really matter; the only difference
803 is precisely which symbol names get printed. */
805 #define file_symbol(s, sn, snl) \
806 (((s)->flags & BSF_FILE) != 0 \
807 || ((sn)[(snl) - 2] == '.' \
808 && ((sn)[(snl) - 1] == 'o' \
809 || (sn)[(snl) - 1] == 'a')))
811 xf = file_symbol (x, xn, xnl);
812 yf = file_symbol (y, yn, ynl);
819 return non_numeric_forward (P_x, P_y);
822 /* This sort routine is used by sort_symbols_by_size. It is sorting
823 an array of size_sym structures into size order. */
826 size_forward2 (P_x, P_y)
830 const struct size_sym *x = (const struct size_sym *) P_x;
831 const struct size_sym *y = (const struct size_sym *) P_y;
833 if (x->size < y->size)
834 return reverse_sort ? 1 : -1;
835 else if (x->size > y->size)
836 return reverse_sort ? -1 : 1;
838 return sorters[0][reverse_sort] (x->minisym, y->minisym);
841 /* Sort the symbols by size. We guess the size by assuming that the
842 difference between the address of a symbol and the address of the
843 next higher symbol is the size. FIXME: ELF actually stores a size
844 with each symbol. We should use it. */
847 sort_symbols_by_size (abfd, dynamic, minisyms, symcount, size, symsizesp)
853 struct size_sym **symsizesp;
855 struct size_sym *symsizes;
856 bfd_byte *from, *fromend;
858 asymbol *store_sym, *store_next;
860 qsort (minisyms, symcount, size, size_forward1);
862 /* We are going to return a special set of symbols and sizes to
864 symsizes = (struct size_sym *) xmalloc (symcount * sizeof (struct size_sym));
865 *symsizesp = symsizes;
867 /* Note that filter_symbols has already removed all absolute and
868 undefined symbols. Here we remove all symbols whose size winds
871 from = (bfd_byte *) minisyms;
872 fromend = from + symcount * size;
879 sym = bfd_minisymbol_to_symbol (abfd, dynamic, (const PTR) from,
882 bfd_fatal (bfd_get_filename (abfd));
885 for (; from < fromend; from += size)
892 if (from + size < fromend)
894 next = bfd_minisymbol_to_symbol (abfd,
896 (const PTR) (from + size),
899 bfd_fatal (bfd_get_filename (abfd));
904 sec = bfd_get_section (sym);
906 if (bfd_is_com_section (sec))
910 if (from + size < fromend
911 && sec == bfd_get_section (next))
912 sz = valueof (next) - valueof (sym);
914 sz = (bfd_get_section_vma (abfd, sec)
915 + bfd_section_size (abfd, sec)
921 symsizes->minisym = (const PTR) from;
929 store_sym = store_next;
933 symcount = symsizes - *symsizesp;
935 /* We must now sort again by size. */
936 qsort ((PTR) *symsizesp, symcount, sizeof (struct size_sym), size_forward2);
941 /* If ARCHIVE_BFD is non-NULL, it is the archive containing ABFD. */
944 display_rel_file (abfd, archive_bfd)
951 struct size_sym *symsizes;
956 if (!(bfd_get_file_flags (abfd) & HAS_SYMS))
958 non_fatal (_("%s: no symbols"), bfd_get_filename (abfd));
963 symcount = bfd_read_minisymbols (abfd, dynamic, &minisyms, &size);
965 bfd_fatal (bfd_get_filename (abfd));
969 non_fatal (_("%s: no symbols"), bfd_get_filename (abfd));
973 bfd_sprintf_vma (abfd, buf, (bfd_vma) -1);
974 print_width = strlen (buf);
976 /* Discard the symbols we don't want to print.
977 It's OK to do this in place; we'll free the storage anyway
980 symcount = filter_symbols (abfd, dynamic, minisyms, symcount, size);
986 sort_dynamic = dynamic;
987 sort_x = bfd_make_empty_symbol (abfd);
988 sort_y = bfd_make_empty_symbol (abfd);
989 if (sort_x == NULL || sort_y == NULL)
990 bfd_fatal (bfd_get_filename (abfd));
993 qsort (minisyms, symcount, size,
994 sorters[sort_numerically][reverse_sort]);
996 symcount = sort_symbols_by_size (abfd, dynamic, minisyms, symcount,
1001 print_symbols (abfd, dynamic, minisyms, symcount, size, archive_bfd);
1003 print_size_symbols (abfd, dynamic, symsizes, symcount, archive_bfd);
1008 /* Choose which symbol entries to print;
1009 compact them downward to get rid of the rest.
1010 Return the number of symbols to be printed. */
1013 filter_symbols (abfd, dynamic, minisyms, symcount, size)
1020 bfd_byte *from, *fromend, *to;
1023 store = bfd_make_empty_symbol (abfd);
1025 bfd_fatal (bfd_get_filename (abfd));
1027 from = (bfd_byte *) minisyms;
1028 fromend = from + symcount * size;
1029 to = (bfd_byte *) minisyms;
1031 for (; from < fromend; from += size)
1038 sym = bfd_minisymbol_to_symbol (abfd, dynamic, (const PTR) from, store);
1040 bfd_fatal (bfd_get_filename (abfd));
1043 keep = bfd_is_und_section (sym->section);
1044 else if (external_only)
1045 keep = ((sym->flags & BSF_GLOBAL) != 0
1046 || (sym->flags & BSF_WEAK) != 0
1047 || bfd_is_und_section (sym->section)
1048 || bfd_is_com_section (sym->section));
1053 && ! print_debug_syms
1054 && (sym->flags & BSF_DEBUGGING) != 0)
1059 && (bfd_is_abs_section (sym->section)
1060 || bfd_is_und_section (sym->section)))
1066 if (bfd_is_und_section (sym->section))
1072 memcpy (to, from, size);
1077 return (to - (bfd_byte *) minisyms) / size;
1080 /* Print symbol name NAME, read from ABFD, with printf format FORMAT,
1081 demangling it if requested. */
1084 print_symname (format, name, abfd)
1089 if (do_demangle && *name)
1093 /* In this mode, give a user-level view of the symbol name
1094 even if it's not mangled; strip off any leading
1096 if (bfd_get_symbol_leading_char (abfd) == name[0])
1099 res = cplus_demangle (name, DMGL_ANSI | DMGL_PARAMS);
1102 printf (format, res);
1108 printf (format, name);
1111 /* Print the symbols. If ARCHIVE_BFD is non-NULL, it is the archive
1115 print_symbols (abfd, dynamic, minisyms, symcount, size, archive_bfd)
1124 bfd_byte *from, *fromend;
1126 store = bfd_make_empty_symbol (abfd);
1128 bfd_fatal (bfd_get_filename (abfd));
1130 from = (bfd_byte *) minisyms;
1131 fromend = from + symcount * size;
1132 for (; from < fromend; from += size)
1136 sym = bfd_minisymbol_to_symbol (abfd, dynamic, from, store);
1138 bfd_fatal (bfd_get_filename (abfd));
1140 print_symbol (abfd, sym, archive_bfd);
1144 /* Print the symbols when sorting by size. */
1147 print_size_symbols (abfd, dynamic, symsizes, symcount, archive_bfd)
1150 struct size_sym *symsizes;
1155 struct size_sym *from, *fromend;
1157 store = bfd_make_empty_symbol (abfd);
1159 bfd_fatal (bfd_get_filename (abfd));
1162 fromend = from + symcount;
1163 for (; from < fromend; from++)
1167 sym = bfd_minisymbol_to_symbol (abfd, dynamic, from->minisym, store);
1169 bfd_fatal (bfd_get_filename (abfd));
1171 /* Set the symbol value so that we actually display the symbol
1173 sym->value = from->size - bfd_section_vma (abfd, bfd_get_section (sym));
1175 print_symbol (abfd, sym, archive_bfd);
1179 /* Print a single symbol. */
1182 print_symbol (abfd, sym, archive_bfd)
1189 (*format->print_symbol_filename) (archive_bfd, abfd);
1193 if (bfd_is_und_section (bfd_get_section (sym)))
1194 print_symname ("%s", bfd_asymbol_name (sym), abfd);
1198 symbol_info syminfo;
1200 bfd_get_symbol_info (abfd, sym, &syminfo);
1201 (*format->print_symbol_info) (&syminfo, abfd);
1206 static asymbol **syms;
1207 static long symcount;
1208 const char *filename, *functionname;
1209 unsigned int lineno;
1211 /* We need to get the canonical symbols in order to call
1212 bfd_find_nearest_line. This is inefficient, but, then, you
1213 don't have to use --line-numbers. */
1214 if (abfd != lineno_cache_bfd && syms != NULL)
1223 symsize = bfd_get_symtab_upper_bound (abfd);
1225 bfd_fatal (bfd_get_filename (abfd));
1226 syms = (asymbol **) xmalloc (symsize);
1227 symcount = bfd_canonicalize_symtab (abfd, syms);
1229 bfd_fatal (bfd_get_filename (abfd));
1230 lineno_cache_bfd = abfd;
1233 if (bfd_is_und_section (bfd_get_section (sym)))
1235 static asection **secs;
1236 static arelent ***relocs;
1237 static long *relcount;
1238 static unsigned int seccount;
1240 const char *symname;
1242 /* For an undefined symbol, we try to find a reloc for the
1243 symbol, and print the line number of the reloc. */
1245 if (abfd != lineno_cache_rel_bfd && relocs != NULL)
1247 for (i = 0; i < seccount; i++)
1248 if (relocs[i] != NULL)
1260 struct get_relocs_info info;
1262 seccount = bfd_count_sections (abfd);
1264 secs = (asection **) xmalloc (seccount * sizeof *secs);
1265 relocs = (arelent ***) xmalloc (seccount * sizeof *relocs);
1266 relcount = (long *) xmalloc (seccount * sizeof *relcount);
1269 info.relocs = relocs;
1270 info.relcount = relcount;
1272 bfd_map_over_sections (abfd, get_relocs, (PTR) &info);
1273 lineno_cache_rel_bfd = abfd;
1276 symname = bfd_asymbol_name (sym);
1277 for (i = 0; i < seccount; i++)
1281 for (j = 0; j < relcount[i]; j++)
1286 if (r->sym_ptr_ptr != NULL
1287 && (*r->sym_ptr_ptr)->section == sym->section
1288 && (*r->sym_ptr_ptr)->value == sym->value
1290 bfd_asymbol_name (*r->sym_ptr_ptr)) == 0
1291 && bfd_find_nearest_line (abfd, secs[i], syms,
1292 r->address, &filename,
1293 &functionname, &lineno))
1295 /* We only print the first one we find. */
1296 printf ("\t%s:%u", filename, lineno);
1303 else if (bfd_get_section (sym)->owner == abfd)
1305 if (bfd_find_nearest_line (abfd, bfd_get_section (sym), syms,
1306 sym->value, &filename, &functionname,
1311 printf ("\t%s:%u", filename, lineno);
1319 /* The following 3 groups of functions are called unconditionally,
1320 once at the start of processing each file of the appropriate type.
1321 They should check `filename_per_file' and `filename_per_symbol',
1322 as appropriate for their output format, to determine whether to
1325 /* Print the name of an object file given on the command line. */
1328 print_object_filename_bsd (filename)
1331 if (filename_per_file && !filename_per_symbol)
1332 printf ("\n%s:\n", filename);
1336 print_object_filename_sysv (filename)
1340 printf (_("\n\nUndefined symbols from %s:\n\n"), filename);
1342 printf (_("\n\nSymbols from %s:\n\n"), filename);
1344 Name Value Class Type Size Line Section\n\n"));
1348 print_object_filename_posix (filename)
1351 if (filename_per_file && !filename_per_symbol)
1352 printf ("%s:\n", filename);
1355 /* Print the name of an archive file given on the command line. */
1358 print_archive_filename_bsd (filename)
1361 if (filename_per_file)
1362 printf ("\n%s:\n", filename);
1366 print_archive_filename_sysv (filename)
1367 char *filename ATTRIBUTE_UNUSED;
1372 print_archive_filename_posix (filename)
1373 char *filename ATTRIBUTE_UNUSED;
1377 /* Print the name of an archive member file. */
1380 print_archive_member_bsd (archive, filename)
1381 char *archive ATTRIBUTE_UNUSED;
1382 CONST char *filename;
1384 if (!filename_per_symbol)
1385 printf ("\n%s:\n", filename);
1389 print_archive_member_sysv (archive, filename)
1391 CONST char *filename;
1394 printf (_("\n\nUndefined symbols from %s[%s]:\n\n"), archive, filename);
1396 printf (_("\n\nSymbols from %s[%s]:\n\n"), archive, filename);
1398 Name Value Class Type Size Line Section\n\n"));
1402 print_archive_member_posix (archive, filename)
1404 CONST char *filename;
1406 if (!filename_per_symbol)
1407 printf ("%s[%s]:\n", archive, filename);
1410 /* Print the name of the file (and archive, if there is one)
1411 containing a symbol. */
1414 print_symbol_filename_bsd (archive_bfd, abfd)
1415 bfd *archive_bfd, *abfd;
1417 if (filename_per_symbol)
1420 printf ("%s:", bfd_get_filename (archive_bfd));
1421 printf ("%s:", bfd_get_filename (abfd));
1426 print_symbol_filename_sysv (archive_bfd, abfd)
1427 bfd *archive_bfd, *abfd;
1429 if (filename_per_symbol)
1432 printf ("%s:", bfd_get_filename (archive_bfd));
1433 printf ("%s:", bfd_get_filename (abfd));
1438 print_symbol_filename_posix (archive_bfd, abfd)
1439 bfd *archive_bfd, *abfd;
1441 if (filename_per_symbol)
1444 printf ("%s[%s]: ", bfd_get_filename (archive_bfd),
1445 bfd_get_filename (abfd));
1447 printf ("%s: ", bfd_get_filename (abfd));
1451 /* Print a symbol value. */
1454 print_value (abfd, val)
1458 #if ! defined (BFD64) || BFD_HOST_64BIT_LONG
1459 printf (value_format, val);
1461 /* We have a 64 bit value to print, but the host is only 32 bit. */
1462 if (print_radix == 16)
1463 bfd_fprintf_vma (abfd, stdout, val);
1469 s = buf + sizeof buf;
1473 *--s = (val % print_radix) + '0';
1476 while ((buf + sizeof buf - 1) - s < 16)
1483 /* Print a line of information about a symbol. */
1486 print_symbol_info_bsd (info, abfd)
1490 if (bfd_is_undefined_symclass (info->type))
1492 if (print_width == 16)
1497 print_value (abfd, info->value);
1498 printf (" %c", info->type);
1499 if (info->type == '-')
1503 printf (other_format, info->stab_other);
1505 printf (desc_format, info->stab_desc);
1506 printf (" %5s", info->stab_name);
1508 print_symname (" %s", info->name, abfd);
1512 print_symbol_info_sysv (info, abfd)
1516 print_symname ("%-20s|", info->name, abfd); /* Name */
1517 if (bfd_is_undefined_symclass (info->type))
1518 printf (" "); /* Value */
1520 print_value (abfd, info->value);
1521 printf ("| %c |", info->type); /* Class */
1522 if (info->type == '-')
1525 printf ("%18s| ", info->stab_name); /* (C) Type */
1526 printf (desc_format, info->stab_desc); /* Size */
1527 printf ("| |"); /* Line, Section */
1530 printf (" | | |"); /* Type, Size, Line, Section */
1534 print_symbol_info_posix (info, abfd)
1538 print_symname ("%s ", info->name, abfd);
1539 printf ("%c ", info->type);
1540 if (bfd_is_undefined_symclass (info->type))
1543 print_value (abfd, info->value);
1544 /* POSIX.2 wants the symbol size printed here, when applicable;
1545 BFD currently doesn't provide it, so we take the easy way out by
1546 considering it to never be applicable. */
1550 print_symdef_entry (abfd)
1553 symindex idx = BFD_NO_MORE_SYMBOLS;
1555 boolean everprinted = false;
1557 for (idx = bfd_get_next_mapent (abfd, idx, &thesym);
1558 idx != BFD_NO_MORE_SYMBOLS;
1559 idx = bfd_get_next_mapent (abfd, idx, &thesym))
1564 printf (_("\nArchive index:\n"));
1567 elt = bfd_get_elt_at_index (abfd, idx);
1569 bfd_fatal ("bfd_get_elt_at_index");
1570 if (thesym->name != (char *) NULL)
1572 print_symname ("%s", thesym->name, abfd);
1573 printf (" in %s\n", bfd_get_filename (elt));
1578 /* This function is used to get the relocs for a particular section.
1579 It is called via bfd_map_over_sections. */
1582 get_relocs (abfd, sec, dataarg)
1587 struct get_relocs_info *data = (struct get_relocs_info *) dataarg;
1591 if ((sec->flags & SEC_RELOC) == 0)
1593 *data->relocs = NULL;
1594 *data->relcount = 0;
1600 relsize = bfd_get_reloc_upper_bound (abfd, sec);
1602 bfd_fatal (bfd_get_filename (abfd));
1604 *data->relocs = (arelent **) xmalloc (relsize);
1605 *data->relcount = bfd_canonicalize_reloc (abfd, sec, *data->relocs,
1607 if (*data->relcount < 0)
1608 bfd_fatal (bfd_get_filename (abfd));