1 /* nm.c -- Describe symbol table of a rel file.
2 Copyright 1991, 92, 93, 94, 95, 96, 97, 98, 99, 2000
3 Free Software Foundation, Inc.
5 This file is part of GNU Binutils.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
26 #include "aout/stab_gnu.h"
27 #include "aout/ranlib.h"
29 #include "libiberty.h"
31 /* When sorting by size, we use this structure to hold the size and a
32 pointer to the minisymbol. */
40 /* When fetching relocs, we use this structure to pass information to
43 struct get_relocs_info
52 usage PARAMS ((FILE *, int));
55 set_print_radix PARAMS ((char *));
58 set_output_format PARAMS ((char *));
61 display_archive PARAMS ((bfd *));
64 display_file PARAMS ((char *filename));
67 display_rel_file PARAMS ((bfd * file, bfd * archive));
70 filter_symbols PARAMS ((bfd *, boolean, PTR, long, unsigned int));
73 sort_symbols_by_size PARAMS ((bfd *, boolean, PTR, long, unsigned int,
77 print_symbols PARAMS ((bfd *, boolean, PTR, long, unsigned int, bfd *));
80 print_size_symbols PARAMS ((bfd *, boolean, struct size_sym *, long, bfd *));
83 print_symname PARAMS ((const char *, const char *, bfd *));
86 print_symbol PARAMS ((bfd *, asymbol *, bfd *));
89 print_symdef_entry PARAMS ((bfd * abfd));
91 /* The sorting functions. */
94 numeric_forward PARAMS ((const PTR, const PTR));
97 numeric_reverse PARAMS ((const PTR, const PTR));
100 non_numeric_forward PARAMS ((const PTR, const PTR));
103 non_numeric_reverse PARAMS ((const PTR, const PTR));
106 size_forward1 PARAMS ((const PTR, const PTR));
109 size_forward2 PARAMS ((const PTR, const PTR));
111 /* The output formatting functions. */
114 print_object_filename_bsd PARAMS ((char *filename));
117 print_object_filename_sysv PARAMS ((char *filename));
120 print_object_filename_posix PARAMS ((char *filename));
124 print_archive_filename_bsd PARAMS ((char *filename));
127 print_archive_filename_sysv PARAMS ((char *filename));
130 print_archive_filename_posix PARAMS ((char *filename));
134 print_archive_member_bsd PARAMS ((char *archive, CONST char *filename));
137 print_archive_member_sysv PARAMS ((char *archive, CONST char *filename));
140 print_archive_member_posix PARAMS ((char *archive, CONST char *filename));
144 print_symbol_filename_bsd PARAMS ((bfd * archive_bfd, bfd * abfd));
147 print_symbol_filename_sysv PARAMS ((bfd * archive_bfd, bfd * abfd));
150 print_symbol_filename_posix PARAMS ((bfd * archive_bfd, bfd * abfd));
154 print_value PARAMS ((bfd_vma));
157 print_symbol_info_bsd PARAMS ((symbol_info * info, bfd * abfd));
160 print_symbol_info_sysv PARAMS ((symbol_info * info, bfd * abfd));
163 print_symbol_info_posix PARAMS ((symbol_info * info, bfd * abfd));
166 get_relocs PARAMS ((bfd *, asection *, PTR));
168 /* Support for different output formats. */
171 /* Print the name of an object file given on the command line. */
172 void (*print_object_filename) PARAMS ((char *filename));
174 /* Print the name of an archive file given on the command line. */
175 void (*print_archive_filename) PARAMS ((char *filename));
177 /* Print the name of an archive member file. */
178 void (*print_archive_member) PARAMS ((char *archive, CONST char *filename));
180 /* Print the name of the file (and archive, if there is one)
181 containing a symbol. */
182 void (*print_symbol_filename) PARAMS ((bfd * archive_bfd, bfd * abfd));
184 /* Print a line of information about a symbol. */
185 void (*print_symbol_info) PARAMS ((symbol_info * info, bfd * abfd));
187 static struct output_fns formats[] =
189 {print_object_filename_bsd,
190 print_archive_filename_bsd,
191 print_archive_member_bsd,
192 print_symbol_filename_bsd,
193 print_symbol_info_bsd},
194 {print_object_filename_sysv,
195 print_archive_filename_sysv,
196 print_archive_member_sysv,
197 print_symbol_filename_sysv,
198 print_symbol_info_sysv},
199 {print_object_filename_posix,
200 print_archive_filename_posix,
201 print_archive_member_posix,
202 print_symbol_filename_posix,
203 print_symbol_info_posix}
206 /* Indices in `formats'. */
208 #define FORMAT_SYSV 1
209 #define FORMAT_POSIX 2
210 #define FORMAT_DEFAULT FORMAT_BSD
212 /* The output format to use. */
213 static struct output_fns *format = &formats[FORMAT_DEFAULT];
216 /* Command options. */
218 static int do_demangle = 0; /* Pretty print C++ symbol names. */
219 static int external_only = 0; /* print external symbols only */
220 static int defined_only = 0; /* Print defined symbols only */
221 static int no_sort = 0; /* don't sort; print syms in order found */
222 static int print_debug_syms = 0; /* print debugger-only symbols too */
223 static int print_armap = 0; /* describe __.SYMDEF data in archive files. */
224 static int reverse_sort = 0; /* sort in downward(alpha or numeric) order */
225 static int sort_numerically = 0; /* sort in numeric rather than alpha order */
226 static int sort_by_size = 0; /* sort by size of symbol */
227 static int undefined_only = 0; /* print undefined symbols only */
228 static int dynamic = 0; /* print dynamic symbols. */
229 static int show_version = 0; /* show the version number */
230 static int show_stats = 0; /* show statistics */
231 static int line_numbers = 0; /* print line numbers for symbols */
233 /* When to print the names of files. Not mutually exclusive in SYSV format. */
234 static int filename_per_file = 0; /* Once per file, on its own line. */
235 static int filename_per_symbol = 0; /* Once per symbol, at start of line. */
237 /* Print formats for printing a symbol value. */
239 static char value_format[] = "%08lx";
241 #if BFD_HOST_64BIT_LONG
242 static char value_format[] = "%016lx";
244 /* We don't use value_format for this case. */
247 static int print_radix = 16;
248 /* Print formats for printing stab info. */
249 static char other_format[] = "%02x";
250 static char desc_format[] = "%04x";
252 static char *target = NULL;
254 /* Used to cache the line numbers for a BFD. */
255 static bfd *lineno_cache_bfd;
256 static bfd *lineno_cache_rel_bfd;
258 #define OPTION_TARGET 200
260 static struct option long_options[] =
262 {"debug-syms", no_argument, &print_debug_syms, 1},
263 {"demangle", optional_argument, 0, 'C'},
264 {"dynamic", no_argument, &dynamic, 1},
265 {"extern-only", no_argument, &external_only, 1},
266 {"format", required_argument, 0, 'f'},
267 {"help", no_argument, 0, 'h'},
268 {"line-numbers", no_argument, 0, 'l'},
269 {"no-cplus", no_argument, &do_demangle, 0}, /* Linux compatibility. */
270 {"no-demangle", no_argument, &do_demangle, 0},
271 {"no-sort", no_argument, &no_sort, 1},
272 {"numeric-sort", no_argument, &sort_numerically, 1},
273 {"portability", no_argument, 0, 'P'},
274 {"print-armap", no_argument, &print_armap, 1},
275 {"print-file-name", no_argument, 0, 'o'},
276 {"radix", required_argument, 0, 't'},
277 {"reverse-sort", no_argument, &reverse_sort, 1},
278 {"size-sort", no_argument, &sort_by_size, 1},
279 {"stats", no_argument, &show_stats, 1},
280 {"target", required_argument, 0, OPTION_TARGET},
281 {"defined-only", no_argument, &defined_only, 1},
282 {"undefined-only", no_argument, &undefined_only, 1},
283 {"version", no_argument, &show_version, 1},
284 {0, no_argument, 0, 0}
287 /* Some error-reporting functions */
290 usage (stream, status)
294 fprintf (stream, _("Usage: %s [OPTION]... [FILE]...\n"), program_name);
295 fprintf (stream, _("List symbols from FILEs (a.out by default).\n"));
296 fprintf (stream, _("\n\
297 -a, --debug-syms Display debugger-only symbols\n\
298 -A, --print-file-name Print name of the input file before every symbol\n\
299 -B Same as --format=bsd\n\
300 -C, --demangle[=STYLE] Decode low-level symbol names into user-level names\n\
301 The STYLE, if specified, can be `auto' (the default),\n\
302 `gnu', 'lucid', 'arm', 'hp', 'edg' or 'gnu-new-abi'\n\
303 --no-demangle Do not demangle low-level symbol names\n\
304 -D, --dynamic Display dynamic symbols instead of normal symbols\n\
305 --defined-only Display only defined symbols\n\
307 -f, --format=FORMAT Use the output format FORMAT. FORMAT can be `bsd',\n\
308 `sysv' or `posix'. The default is `bsd'\n\
309 -g, --extern-only Display only external symbols\n\
310 -h, --help Display this information\n\
311 -l, --line-numbers Use debugging information to find a filename and\n\
312 line number for each symbol\n\
313 -n, --numeric-sort Sort symbols numerically by address\n\
315 -p, --no-sort Do not sort the symbols\n\
316 -P, --portability Same as --format=posix\n\
317 -r, --reverse-sort Reverse the sense of the sort\n\
318 -s, --print-armap Include index for symbols from archive members\n\
319 --size-sort Sort symbols by size\n\
320 -t, --radix=RADIX Use RADIX for printing symbol values\n\
321 --target=BFDNAME Specify the target object format as BFDNAME\n\
322 -u, --undefined-only Display only undefined symbols\n\
323 -V, --version Display this program's version number\n\
325 list_supported_targets (program_name, stream);
327 fprintf (stream, _("Report bugs to %s.\n"), REPORT_BUGS_TO);
331 /* Set the radix for the symbol value and size according to RADIX. */
334 set_print_radix (radix)
348 value_format[4] = *radix;
350 #if BFD_HOST_64BIT_LONG
351 value_format[5] = *radix;
353 /* This case requires special handling for octal and decimal
357 other_format[3] = desc_format[3] = *radix;
360 fatal (_("%s: invalid radix"), radix);
365 set_output_format (f)
385 fatal (_("%s: invalid output format"), f);
387 format = &formats[i];
398 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
399 setlocale (LC_MESSAGES, "");
401 bindtextdomain (PACKAGE, LOCALEDIR);
402 textdomain (PACKAGE);
404 program_name = *argv;
405 xmalloc_set_program_name (program_name);
407 START_PROGRESS (program_name, 0);
410 set_default_bfd_target ();
412 while ((c = getopt_long (argc, argv, "aABCDef:glnopPrst:uvV",
413 long_options, (int *) 0)) != EOF)
418 print_debug_syms = 1;
422 filename_per_symbol = 1;
424 case 'B': /* For MIPS compatibility. */
425 set_output_format ("bsd");
431 enum demangling_styles style;
433 style = cplus_demangle_name_to_style (optarg);
434 if (style == unknown_demangling)
435 fatal (_("unknown demangling style `%s'"),
438 cplus_demangle_set_style (style);
445 /* Ignored for HP/UX compatibility. */
448 set_output_format (optarg);
460 sort_numerically = 1;
466 set_output_format ("posix");
475 set_print_radix (optarg);
484 case OPTION_TARGET: /* --target */
488 case 0: /* A long option that just sets a flag. */
497 print_version ("nm");
499 /* OK, all options now parsed. If no filename specified, do a.out. */
501 return !display_file ("a.out");
505 if (argc - optind > 1)
506 filename_per_file = 1;
508 /* We were given several filenames to do. */
509 while (optind < argc)
512 if (!display_file (argv[optind++]))
516 END_PROGRESS (program_name);
521 char *lim = (char *) sbrk (0);
523 non_fatal (_("data size %ld"), (long) (lim - (char *) &environ));
532 display_archive (file)
536 bfd *last_arfile = NULL;
539 (*format->print_archive_filename) (bfd_get_filename (file));
542 print_symdef_entry (file);
548 arfile = bfd_openr_next_archived_file (file, arfile);
552 if (bfd_get_error () != bfd_error_no_more_archived_files)
553 bfd_fatal (bfd_get_filename (file));
557 if (bfd_check_format_matches (arfile, bfd_object, &matching))
559 (*format->print_archive_member) (bfd_get_filename (file),
560 bfd_get_filename (arfile));
561 display_rel_file (arfile, file);
565 bfd_nonfatal (bfd_get_filename (arfile));
566 if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
568 list_matching_formats (matching);
573 if (last_arfile != NULL)
575 bfd_close (last_arfile);
576 lineno_cache_bfd = NULL;
577 lineno_cache_rel_bfd = NULL;
579 last_arfile = arfile;
582 if (last_arfile != NULL)
584 bfd_close (last_arfile);
585 lineno_cache_bfd = NULL;
586 lineno_cache_rel_bfd = NULL;
591 display_file (filename)
594 boolean retval = true;
598 file = bfd_openr (filename, target);
601 bfd_nonfatal (filename);
605 if (bfd_check_format (file, bfd_archive))
607 display_archive (file);
609 else if (bfd_check_format_matches (file, bfd_object, &matching))
611 (*format->print_object_filename) (filename);
612 display_rel_file (file, NULL);
616 bfd_nonfatal (filename);
617 if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
619 list_matching_formats (matching);
625 if (bfd_close (file) == false)
626 bfd_fatal (filename);
628 lineno_cache_bfd = NULL;
629 lineno_cache_rel_bfd = NULL;
634 /* These globals are used to pass information into the sorting
636 static bfd *sort_bfd;
637 static boolean sort_dynamic;
638 static asymbol *sort_x;
639 static asymbol *sort_y;
641 /* Symbol-sorting predicates */
642 #define valueof(x) ((x)->section->vma + (x)->value)
644 /* Numeric sorts. Undefined symbols are always considered "less than"
645 defined symbols with zero values. Common symbols are not treated
646 specially -- i.e., their sizes are used as their "values". */
649 numeric_forward (P_x, P_y)
656 x = bfd_minisymbol_to_symbol (sort_bfd, sort_dynamic, P_x, sort_x);
657 y = bfd_minisymbol_to_symbol (sort_bfd, sort_dynamic, P_y, sort_y);
658 if (x == NULL || y == NULL)
659 bfd_fatal (bfd_get_filename (sort_bfd));
661 xs = bfd_get_section (x);
662 ys = bfd_get_section (y);
664 if (bfd_is_und_section (xs))
666 if (! bfd_is_und_section (ys))
669 else if (bfd_is_und_section (ys))
671 else if (valueof (x) != valueof (y))
672 return valueof (x) < valueof (y) ? -1 : 1;
674 return non_numeric_forward (P_x, P_y);
678 numeric_reverse (x, y)
682 return - numeric_forward (x, y);
686 non_numeric_forward (P_x, P_y)
693 x = bfd_minisymbol_to_symbol (sort_bfd, sort_dynamic, P_x, sort_x);
694 y = bfd_minisymbol_to_symbol (sort_bfd, sort_dynamic, P_y, sort_y);
695 if (x == NULL || y == NULL)
696 bfd_fatal (bfd_get_filename (sort_bfd));
698 xn = bfd_asymbol_name (x);
699 yn = bfd_asymbol_name (y);
701 return ((xn == NULL) ? ((yn == NULL) ? 0 : -1) :
702 ((yn == NULL) ? 1 : strcmp (xn, yn)));
706 non_numeric_reverse (x, y)
710 return - non_numeric_forward (x, y);
713 static int (*(sorters[2][2])) PARAMS ((const PTR, const PTR)) =
715 { non_numeric_forward, non_numeric_reverse },
716 { numeric_forward, numeric_reverse }
719 /* This sort routine is used by sort_symbols_by_size. It is similar
720 to numeric_forward, but when symbols have the same value it sorts
721 by section VMA. This simplifies the sort_symbols_by_size code
722 which handles symbols at the end of sections. Also, this routine
723 tries to sort file names before other symbols with the same value.
724 That will make the file name have a zero size, which will make
725 sort_symbols_by_size choose the non file name symbol, leading to
726 more meaningful output. For similar reasons, this code sorts
727 gnu_compiled_* and gcc2_compiled before other symbols with the same
731 size_forward1 (P_x, P_y)
741 x = bfd_minisymbol_to_symbol (sort_bfd, sort_dynamic, P_x, sort_x);
742 y = bfd_minisymbol_to_symbol (sort_bfd, sort_dynamic, P_y, sort_y);
743 if (x == NULL || y == NULL)
744 bfd_fatal (bfd_get_filename (sort_bfd));
746 xs = bfd_get_section (x);
747 ys = bfd_get_section (y);
749 if (bfd_is_und_section (xs))
751 if (bfd_is_und_section (ys))
754 if (valueof (x) != valueof (y))
755 return valueof (x) < valueof (y) ? -1 : 1;
757 if (xs->vma != ys->vma)
758 return xs->vma < ys->vma ? -1 : 1;
760 xn = bfd_asymbol_name (x);
761 yn = bfd_asymbol_name (y);
765 /* The symbols gnu_compiled and gcc2_compiled convey even less
766 information than the file name, so sort them out first. */
768 xf = (strstr (xn, "gnu_compiled") != NULL
769 || strstr (xn, "gcc2_compiled") != NULL);
770 yf = (strstr (yn, "gnu_compiled") != NULL
771 || strstr (yn, "gcc2_compiled") != NULL);
778 /* We use a heuristic for the file name. It may not work on non
779 Unix systems, but it doesn't really matter; the only difference
780 is precisely which symbol names get printed. */
782 #define file_symbol(s, sn, snl) \
783 (((s)->flags & BSF_FILE) != 0 \
784 || ((sn)[(snl) - 2] == '.' \
785 && ((sn)[(snl) - 1] == 'o' \
786 || (sn)[(snl) - 1] == 'a')))
788 xf = file_symbol (x, xn, xnl);
789 yf = file_symbol (y, yn, ynl);
796 return non_numeric_forward (P_x, P_y);
799 /* This sort routine is used by sort_symbols_by_size. It is sorting
800 an array of size_sym structures into size order. */
803 size_forward2 (P_x, P_y)
807 const struct size_sym *x = (const struct size_sym *) P_x;
808 const struct size_sym *y = (const struct size_sym *) P_y;
810 if (x->size < y->size)
811 return reverse_sort ? 1 : -1;
812 else if (x->size > y->size)
813 return reverse_sort ? -1 : 1;
815 return sorters[0][reverse_sort] (x->minisym, y->minisym);
818 /* Sort the symbols by size. We guess the size by assuming that the
819 difference between the address of a symbol and the address of the
820 next higher symbol is the size. FIXME: ELF actually stores a size
821 with each symbol. We should use it. */
824 sort_symbols_by_size (abfd, dynamic, minisyms, symcount, size, symsizesp)
830 struct size_sym **symsizesp;
832 struct size_sym *symsizes;
833 bfd_byte *from, *fromend;
835 asymbol *store_sym, *store_next;
837 qsort (minisyms, symcount, size, size_forward1);
839 /* We are going to return a special set of symbols and sizes to
841 symsizes = (struct size_sym *) xmalloc (symcount * sizeof (struct size_sym));
842 *symsizesp = symsizes;
844 /* Note that filter_symbols has already removed all absolute and
845 undefined symbols. Here we remove all symbols whose size winds
848 from = (bfd_byte *) minisyms;
849 fromend = from + symcount * size;
856 sym = bfd_minisymbol_to_symbol (abfd, dynamic, (const PTR) from,
859 bfd_fatal (bfd_get_filename (abfd));
862 for (; from < fromend; from += size)
869 if (from + size < fromend)
871 next = bfd_minisymbol_to_symbol (abfd,
873 (const PTR) (from + size),
876 bfd_fatal (bfd_get_filename (abfd));
881 sec = bfd_get_section (sym);
883 if (bfd_is_com_section (sec))
887 if (from + size < fromend
888 && sec == bfd_get_section (next))
889 sz = valueof (next) - valueof (sym);
891 sz = (bfd_get_section_vma (abfd, sec)
892 + bfd_section_size (abfd, sec)
898 symsizes->minisym = (const PTR) from;
906 store_sym = store_next;
910 symcount = symsizes - *symsizesp;
912 /* We must now sort again by size. */
913 qsort ((PTR) *symsizesp, symcount, sizeof (struct size_sym), size_forward2);
918 /* If ARCHIVE_BFD is non-NULL, it is the archive containing ABFD. */
921 display_rel_file (abfd, archive_bfd)
928 struct size_sym *symsizes;
932 if (!(bfd_get_file_flags (abfd) & HAS_SYMS))
934 non_fatal (_("%s: no symbols"), bfd_get_filename (abfd));
939 symcount = bfd_read_minisymbols (abfd, dynamic, &minisyms, &size);
941 bfd_fatal (bfd_get_filename (abfd));
945 non_fatal (_("%s: no symbols"), bfd_get_filename (abfd));
949 /* Discard the symbols we don't want to print.
950 It's OK to do this in place; we'll free the storage anyway
953 symcount = filter_symbols (abfd, dynamic, minisyms, symcount, size);
959 sort_dynamic = dynamic;
960 sort_x = bfd_make_empty_symbol (abfd);
961 sort_y = bfd_make_empty_symbol (abfd);
962 if (sort_x == NULL || sort_y == NULL)
963 bfd_fatal (bfd_get_filename (abfd));
966 qsort (minisyms, symcount, size,
967 sorters[sort_numerically][reverse_sort]);
969 symcount = sort_symbols_by_size (abfd, dynamic, minisyms, symcount,
974 print_symbols (abfd, dynamic, minisyms, symcount, size, archive_bfd);
976 print_size_symbols (abfd, dynamic, symsizes, symcount, archive_bfd);
981 /* Choose which symbol entries to print;
982 compact them downward to get rid of the rest.
983 Return the number of symbols to be printed. */
986 filter_symbols (abfd, dynamic, minisyms, symcount, size)
993 bfd_byte *from, *fromend, *to;
996 store = bfd_make_empty_symbol (abfd);
998 bfd_fatal (bfd_get_filename (abfd));
1000 from = (bfd_byte *) minisyms;
1001 fromend = from + symcount * size;
1002 to = (bfd_byte *) minisyms;
1004 for (; from < fromend; from += size)
1011 sym = bfd_minisymbol_to_symbol (abfd, dynamic, (const PTR) from, store);
1013 bfd_fatal (bfd_get_filename (abfd));
1016 keep = bfd_is_und_section (sym->section);
1017 else if (external_only)
1018 keep = ((sym->flags & BSF_GLOBAL) != 0
1019 || (sym->flags & BSF_WEAK) != 0
1020 || bfd_is_und_section (sym->section)
1021 || bfd_is_com_section (sym->section));
1026 && ! print_debug_syms
1027 && (sym->flags & BSF_DEBUGGING) != 0)
1032 && (bfd_is_abs_section (sym->section)
1033 || bfd_is_und_section (sym->section)))
1039 if (bfd_is_und_section (sym->section))
1045 memcpy (to, from, size);
1050 return (to - (bfd_byte *) minisyms) / size;
1053 /* Print symbol name NAME, read from ABFD, with printf format FORMAT,
1054 demangling it if requested. */
1057 print_symname (format, name, abfd)
1062 if (do_demangle && *name)
1066 /* In this mode, give a user-level view of the symbol name
1067 even if it's not mangled; strip off any leading
1069 if (bfd_get_symbol_leading_char (abfd) == name[0])
1072 res = cplus_demangle (name, DMGL_ANSI | DMGL_PARAMS);
1075 printf (format, res);
1081 printf (format, name);
1084 /* Print the symbols. If ARCHIVE_BFD is non-NULL, it is the archive
1088 print_symbols (abfd, dynamic, minisyms, symcount, size, archive_bfd)
1097 bfd_byte *from, *fromend;
1099 store = bfd_make_empty_symbol (abfd);
1101 bfd_fatal (bfd_get_filename (abfd));
1103 from = (bfd_byte *) minisyms;
1104 fromend = from + symcount * size;
1105 for (; from < fromend; from += size)
1109 sym = bfd_minisymbol_to_symbol (abfd, dynamic, from, store);
1111 bfd_fatal (bfd_get_filename (abfd));
1113 print_symbol (abfd, sym, archive_bfd);
1117 /* Print the symbols when sorting by size. */
1120 print_size_symbols (abfd, dynamic, symsizes, symcount, archive_bfd)
1123 struct size_sym *symsizes;
1128 struct size_sym *from, *fromend;
1130 store = bfd_make_empty_symbol (abfd);
1132 bfd_fatal (bfd_get_filename (abfd));
1135 fromend = from + symcount;
1136 for (; from < fromend; from++)
1140 sym = bfd_minisymbol_to_symbol (abfd, dynamic, from->minisym, store);
1142 bfd_fatal (bfd_get_filename (abfd));
1144 /* Set the symbol value so that we actually display the symbol
1146 sym->value = from->size - bfd_section_vma (abfd, bfd_get_section (sym));
1148 print_symbol (abfd, sym, archive_bfd);
1152 /* Print a single symbol. */
1155 print_symbol (abfd, sym, archive_bfd)
1162 (*format->print_symbol_filename) (archive_bfd, abfd);
1166 if (bfd_is_und_section (bfd_get_section (sym)))
1167 print_symname ("%s", bfd_asymbol_name (sym), abfd);
1171 symbol_info syminfo;
1173 bfd_get_symbol_info (abfd, sym, &syminfo);
1174 (*format->print_symbol_info) (&syminfo, abfd);
1179 static asymbol **syms;
1180 static long symcount;
1181 const char *filename, *functionname;
1182 unsigned int lineno;
1184 /* We need to get the canonical symbols in order to call
1185 bfd_find_nearest_line. This is inefficient, but, then, you
1186 don't have to use --line-numbers. */
1187 if (abfd != lineno_cache_bfd && syms != NULL)
1196 symsize = bfd_get_symtab_upper_bound (abfd);
1198 bfd_fatal (bfd_get_filename (abfd));
1199 syms = (asymbol **) xmalloc (symsize);
1200 symcount = bfd_canonicalize_symtab (abfd, syms);
1202 bfd_fatal (bfd_get_filename (abfd));
1203 lineno_cache_bfd = abfd;
1206 if (bfd_is_und_section (bfd_get_section (sym)))
1208 static asection **secs;
1209 static arelent ***relocs;
1210 static long *relcount;
1211 static unsigned int seccount;
1213 const char *symname;
1215 /* For an undefined symbol, we try to find a reloc for the
1216 symbol, and print the line number of the reloc. */
1218 if (abfd != lineno_cache_rel_bfd && relocs != NULL)
1220 for (i = 0; i < seccount; i++)
1221 if (relocs[i] != NULL)
1233 struct get_relocs_info info;
1235 seccount = bfd_count_sections (abfd);
1237 secs = (asection **) xmalloc (seccount * sizeof *secs);
1238 relocs = (arelent ***) xmalloc (seccount * sizeof *relocs);
1239 relcount = (long *) xmalloc (seccount * sizeof *relcount);
1242 info.relocs = relocs;
1243 info.relcount = relcount;
1245 bfd_map_over_sections (abfd, get_relocs, (PTR) &info);
1246 lineno_cache_rel_bfd = abfd;
1249 symname = bfd_asymbol_name (sym);
1250 for (i = 0; i < seccount; i++)
1254 for (j = 0; j < relcount[i]; j++)
1259 if (r->sym_ptr_ptr != NULL
1260 && (*r->sym_ptr_ptr)->section == sym->section
1261 && (*r->sym_ptr_ptr)->value == sym->value
1263 bfd_asymbol_name (*r->sym_ptr_ptr)) == 0
1264 && bfd_find_nearest_line (abfd, secs[i], syms,
1265 r->address, &filename,
1266 &functionname, &lineno))
1268 /* We only print the first one we find. */
1269 printf ("\t%s:%u", filename, lineno);
1276 else if (bfd_get_section (sym)->owner == abfd)
1278 if (bfd_find_nearest_line (abfd, bfd_get_section (sym), syms,
1279 sym->value, &filename, &functionname,
1284 printf ("\t%s:%u", filename, lineno);
1292 /* The following 3 groups of functions are called unconditionally,
1293 once at the start of processing each file of the appropriate type.
1294 They should check `filename_per_file' and `filename_per_symbol',
1295 as appropriate for their output format, to determine whether to
1298 /* Print the name of an object file given on the command line. */
1301 print_object_filename_bsd (filename)
1304 if (filename_per_file && !filename_per_symbol)
1305 printf ("\n%s:\n", filename);
1309 print_object_filename_sysv (filename)
1313 printf (_("\n\nUndefined symbols from %s:\n\n"), filename);
1315 printf (_("\n\nSymbols from %s:\n\n"), filename);
1317 Name Value Class Type Size Line Section\n\n"));
1321 print_object_filename_posix (filename)
1324 if (filename_per_file && !filename_per_symbol)
1325 printf ("%s:\n", filename);
1328 /* Print the name of an archive file given on the command line. */
1331 print_archive_filename_bsd (filename)
1334 if (filename_per_file)
1335 printf ("\n%s:\n", filename);
1339 print_archive_filename_sysv (filename)
1340 char *filename ATTRIBUTE_UNUSED;
1345 print_archive_filename_posix (filename)
1346 char *filename ATTRIBUTE_UNUSED;
1350 /* Print the name of an archive member file. */
1353 print_archive_member_bsd (archive, filename)
1354 char *archive ATTRIBUTE_UNUSED;
1355 CONST char *filename;
1357 if (!filename_per_symbol)
1358 printf ("\n%s:\n", filename);
1362 print_archive_member_sysv (archive, filename)
1364 CONST char *filename;
1367 printf (_("\n\nUndefined symbols from %s[%s]:\n\n"), archive, filename);
1369 printf (_("\n\nSymbols from %s[%s]:\n\n"), archive, filename);
1371 Name Value Class Type Size Line Section\n\n"));
1375 print_archive_member_posix (archive, filename)
1377 CONST char *filename;
1379 if (!filename_per_symbol)
1380 printf ("%s[%s]:\n", archive, filename);
1383 /* Print the name of the file (and archive, if there is one)
1384 containing a symbol. */
1387 print_symbol_filename_bsd (archive_bfd, abfd)
1388 bfd *archive_bfd, *abfd;
1390 if (filename_per_symbol)
1393 printf ("%s:", bfd_get_filename (archive_bfd));
1394 printf ("%s:", bfd_get_filename (abfd));
1399 print_symbol_filename_sysv (archive_bfd, abfd)
1400 bfd *archive_bfd, *abfd;
1402 if (filename_per_symbol)
1405 printf ("%s:", bfd_get_filename (archive_bfd));
1406 printf ("%s:", bfd_get_filename (abfd));
1411 print_symbol_filename_posix (archive_bfd, abfd)
1412 bfd *archive_bfd, *abfd;
1414 if (filename_per_symbol)
1417 printf ("%s[%s]: ", bfd_get_filename (archive_bfd),
1418 bfd_get_filename (abfd));
1420 printf ("%s: ", bfd_get_filename (abfd));
1424 /* Print a symbol value. */
1430 #if ! defined (BFD64) || BFD_HOST_64BIT_LONG
1431 printf (value_format, val);
1433 /* We have a 64 bit value to print, but the host is only 32 bit. */
1434 if (print_radix == 16)
1435 fprintf_vma (stdout, val);
1441 s = buf + sizeof buf;
1445 *--s = (val % print_radix) + '0';
1448 while ((buf + sizeof buf - 1) - s < 16)
1455 /* Print a line of information about a symbol. */
1458 print_symbol_info_bsd (info, abfd)
1462 if (bfd_is_undefined_symclass (info->type))
1473 print_value (info->value);
1474 printf (" %c", info->type);
1475 if (info->type == '-')
1479 printf (other_format, info->stab_other);
1481 printf (desc_format, info->stab_desc);
1482 printf (" %5s", info->stab_name);
1484 print_symname (" %s", info->name, abfd);
1488 print_symbol_info_sysv (info, abfd)
1492 print_symname ("%-20s|", info->name, abfd); /* Name */
1493 if (bfd_is_undefined_symclass (info->type))
1494 printf (" "); /* Value */
1496 print_value (info->value);
1497 printf ("| %c |", info->type); /* Class */
1498 if (info->type == '-')
1501 printf ("%18s| ", info->stab_name); /* (C) Type */
1502 printf (desc_format, info->stab_desc); /* Size */
1503 printf ("| |"); /* Line, Section */
1506 printf (" | | |"); /* Type, Size, Line, Section */
1510 print_symbol_info_posix (info, abfd)
1514 print_symname ("%s ", info->name, abfd);
1515 printf ("%c ", info->type);
1516 if (bfd_is_undefined_symclass (info->type))
1519 print_value (info->value);
1520 /* POSIX.2 wants the symbol size printed here, when applicable;
1521 BFD currently doesn't provide it, so we take the easy way out by
1522 considering it to never be applicable. */
1526 print_symdef_entry (abfd)
1529 symindex idx = BFD_NO_MORE_SYMBOLS;
1531 boolean everprinted = false;
1533 for (idx = bfd_get_next_mapent (abfd, idx, &thesym);
1534 idx != BFD_NO_MORE_SYMBOLS;
1535 idx = bfd_get_next_mapent (abfd, idx, &thesym))
1540 printf (_("\nArchive index:\n"));
1543 elt = bfd_get_elt_at_index (abfd, idx);
1545 bfd_fatal ("bfd_get_elt_at_index");
1546 if (thesym->name != (char *) NULL)
1548 print_symname ("%s", thesym->name, abfd);
1549 printf (" in %s\n", bfd_get_filename (elt));
1554 /* This function is used to get the relocs for a particular section.
1555 It is called via bfd_map_over_sections. */
1558 get_relocs (abfd, sec, dataarg)
1563 struct get_relocs_info *data = (struct get_relocs_info *) dataarg;
1567 if ((sec->flags & SEC_RELOC) == 0)
1569 *data->relocs = NULL;
1570 *data->relcount = 0;
1576 relsize = bfd_get_reloc_upper_bound (abfd, sec);
1578 bfd_fatal (bfd_get_filename (abfd));
1580 *data->relocs = (arelent **) xmalloc (relsize);
1581 *data->relcount = bfd_canonicalize_reloc (abfd, sec, *data->relocs,
1583 if (*data->relcount < 0)
1584 bfd_fatal (bfd_get_filename (abfd));