1 /* nm.c -- Describe symbol table of a rel file.
2 Copyright 1991, 92, 93, 94, 95, 96, 97, 98, 1999
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", no_argument, &do_demangle, 1},
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, _("\
295 Usage: %s [-aABCDglnopPrsuvV] [-t radix] [--radix=radix] [--target=bfdname]\n\
296 [--debug-syms] [--extern-only] [--print-armap] [--print-file-name]\n\
297 [--numeric-sort] [--no-sort] [--reverse-sort] [--size-sort]\n\
298 [--undefined-only] [--portability] [-f {bsd,sysv,posix}]\n\
299 [--format={bsd,sysv,posix}] [--demangle] [--no-demangle] [--dynamic]\n\
300 [--defined-only] [--line-numbers]\n\
301 [--version] [--help]\n\
304 list_supported_targets (program_name, stream);
306 fprintf (stream, _("Report bugs to %s\n"), REPORT_BUGS_TO);
310 /* Set the radix for the symbol value and size according to RADIX. */
313 set_print_radix (radix)
327 value_format[4] = *radix;
329 #if BFD_HOST_64BIT_LONG
330 value_format[5] = *radix;
332 /* This case requires special handling for octal and decimal
336 other_format[3] = desc_format[3] = *radix;
339 fprintf (stderr, _("%s: %s: invalid radix\n"), program_name, radix);
345 set_output_format (f)
365 fprintf (stderr, _("%s: %s: invalid output format\n"), program_name, f);
368 format = &formats[i];
379 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
380 setlocale (LC_MESSAGES, "");
382 bindtextdomain (PACKAGE, LOCALEDIR);
383 textdomain (PACKAGE);
385 program_name = *argv;
386 xmalloc_set_program_name (program_name);
388 START_PROGRESS (program_name, 0);
391 set_default_bfd_target ();
393 while ((c = getopt_long (argc, argv, "aABCDef:glnopPrst:uvV", long_options, (int *) 0)) != EOF)
398 print_debug_syms = 1;
402 filename_per_symbol = 1;
404 case 'B': /* For MIPS compatibility. */
405 set_output_format ("bsd");
414 /* Ignored for HP/UX compatibility. */
417 set_output_format (optarg);
429 sort_numerically = 1;
435 set_output_format ("posix");
444 set_print_radix (optarg);
453 case OPTION_TARGET: /* --target */
457 case 0: /* A long option that just sets a flag. */
466 print_version ("nm");
468 /* OK, all options now parsed. If no filename specified, do a.out. */
470 return !display_file ("a.out");
474 if (argc - optind > 1)
475 filename_per_file = 1;
477 /* We were given several filenames to do. */
478 while (optind < argc)
481 if (!display_file (argv[optind++]))
485 END_PROGRESS (program_name);
490 char *lim = (char *) sbrk (0);
492 fprintf (stderr, _("%s: data size %ld\n"), program_name,
493 (long) (lim - (char *) &environ));
502 display_archive (file)
506 bfd *last_arfile = NULL;
509 (*format->print_archive_filename) (bfd_get_filename (file));
512 print_symdef_entry (file);
518 arfile = bfd_openr_next_archived_file (file, arfile);
522 if (bfd_get_error () != bfd_error_no_more_archived_files)
523 bfd_fatal (bfd_get_filename (file));
527 if (bfd_check_format_matches (arfile, bfd_object, &matching))
529 (*format->print_archive_member) (bfd_get_filename (file),
530 bfd_get_filename (arfile));
531 display_rel_file (arfile, file);
535 bfd_nonfatal (bfd_get_filename (arfile));
536 if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
538 list_matching_formats (matching);
543 if (last_arfile != NULL)
545 bfd_close (last_arfile);
546 lineno_cache_bfd = NULL;
547 lineno_cache_rel_bfd = NULL;
549 last_arfile = arfile;
552 if (last_arfile != NULL)
554 bfd_close (last_arfile);
555 lineno_cache_bfd = NULL;
556 lineno_cache_rel_bfd = NULL;
561 display_file (filename)
564 boolean retval = true;
568 file = bfd_openr (filename, target);
571 bfd_nonfatal (filename);
575 if (bfd_check_format (file, bfd_archive))
577 display_archive (file);
579 else if (bfd_check_format_matches (file, bfd_object, &matching))
581 (*format->print_object_filename) (filename);
582 display_rel_file (file, NULL);
586 bfd_nonfatal (filename);
587 if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
589 list_matching_formats (matching);
595 if (bfd_close (file) == false)
596 bfd_fatal (filename);
598 lineno_cache_bfd = NULL;
599 lineno_cache_rel_bfd = NULL;
604 /* These globals are used to pass information into the sorting
606 static bfd *sort_bfd;
607 static boolean sort_dynamic;
608 static asymbol *sort_x;
609 static asymbol *sort_y;
611 /* Symbol-sorting predicates */
612 #define valueof(x) ((x)->section->vma + (x)->value)
614 /* Numeric sorts. Undefined symbols are always considered "less than"
615 defined symbols with zero values. Common symbols are not treated
616 specially -- i.e., their sizes are used as their "values". */
619 numeric_forward (P_x, P_y)
626 x = bfd_minisymbol_to_symbol (sort_bfd, sort_dynamic, P_x, sort_x);
627 y = bfd_minisymbol_to_symbol (sort_bfd, sort_dynamic, P_y, sort_y);
628 if (x == NULL || y == NULL)
629 bfd_fatal (bfd_get_filename (sort_bfd));
631 xs = bfd_get_section (x);
632 ys = bfd_get_section (y);
634 if (bfd_is_und_section (xs))
636 if (! bfd_is_und_section (ys))
639 else if (bfd_is_und_section (ys))
641 else if (valueof (x) != valueof (y))
642 return valueof (x) < valueof (y) ? -1 : 1;
644 return non_numeric_forward (P_x, P_y);
648 numeric_reverse (x, y)
652 return - numeric_forward (x, y);
656 non_numeric_forward (P_x, P_y)
663 x = bfd_minisymbol_to_symbol (sort_bfd, sort_dynamic, P_x, sort_x);
664 y = bfd_minisymbol_to_symbol (sort_bfd, sort_dynamic, P_y, sort_y);
665 if (x == NULL || y == NULL)
666 bfd_fatal (bfd_get_filename (sort_bfd));
668 xn = bfd_asymbol_name (x);
669 yn = bfd_asymbol_name (y);
671 return ((xn == NULL) ? ((yn == NULL) ? 0 : -1) :
672 ((yn == NULL) ? 1 : strcmp (xn, yn)));
676 non_numeric_reverse (x, y)
680 return - non_numeric_forward (x, y);
683 static int (*(sorters[2][2])) PARAMS ((const PTR, const PTR)) =
685 { non_numeric_forward, non_numeric_reverse },
686 { numeric_forward, numeric_reverse }
689 /* This sort routine is used by sort_symbols_by_size. It is similar
690 to numeric_forward, but when symbols have the same value it sorts
691 by section VMA. This simplifies the sort_symbols_by_size code
692 which handles symbols at the end of sections. Also, this routine
693 tries to sort file names before other symbols with the same value.
694 That will make the file name have a zero size, which will make
695 sort_symbols_by_size choose the non file name symbol, leading to
696 more meaningful output. For similar reasons, this code sorts
697 gnu_compiled_* and gcc2_compiled before other symbols with the same
701 size_forward1 (P_x, P_y)
711 x = bfd_minisymbol_to_symbol (sort_bfd, sort_dynamic, P_x, sort_x);
712 y = bfd_minisymbol_to_symbol (sort_bfd, sort_dynamic, P_y, sort_y);
713 if (x == NULL || y == NULL)
714 bfd_fatal (bfd_get_filename (sort_bfd));
716 xs = bfd_get_section (x);
717 ys = bfd_get_section (y);
719 if (bfd_is_und_section (xs))
721 if (bfd_is_und_section (ys))
724 if (valueof (x) != valueof (y))
725 return valueof (x) < valueof (y) ? -1 : 1;
727 if (xs->vma != ys->vma)
728 return xs->vma < ys->vma ? -1 : 1;
730 xn = bfd_asymbol_name (x);
731 yn = bfd_asymbol_name (y);
735 /* The symbols gnu_compiled and gcc2_compiled convey even less
736 information than the file name, so sort them out first. */
738 xf = (strstr (xn, "gnu_compiled") != NULL
739 || strstr (xn, "gcc2_compiled") != NULL);
740 yf = (strstr (yn, "gnu_compiled") != NULL
741 || strstr (yn, "gcc2_compiled") != NULL);
748 /* We use a heuristic for the file name. It may not work on non
749 Unix systems, but it doesn't really matter; the only difference
750 is precisely which symbol names get printed. */
752 #define file_symbol(s, sn, snl) \
753 (((s)->flags & BSF_FILE) != 0 \
754 || ((sn)[(snl) - 2] == '.' \
755 && ((sn)[(snl) - 1] == 'o' \
756 || (sn)[(snl) - 1] == 'a')))
758 xf = file_symbol (x, xn, xnl);
759 yf = file_symbol (y, yn, ynl);
766 return non_numeric_forward (P_x, P_y);
769 /* This sort routine is used by sort_symbols_by_size. It is sorting
770 an array of size_sym structures into size order. */
773 size_forward2 (P_x, P_y)
777 const struct size_sym *x = (const struct size_sym *) P_x;
778 const struct size_sym *y = (const struct size_sym *) P_y;
780 if (x->size < y->size)
781 return reverse_sort ? 1 : -1;
782 else if (x->size > y->size)
783 return reverse_sort ? -1 : 1;
785 return sorters[0][reverse_sort] (x->minisym, y->minisym);
788 /* Sort the symbols by size. We guess the size by assuming that the
789 difference between the address of a symbol and the address of the
790 next higher symbol is the size. FIXME: ELF actually stores a size
791 with each symbol. We should use it. */
794 sort_symbols_by_size (abfd, dynamic, minisyms, symcount, size, symsizesp)
800 struct size_sym **symsizesp;
802 struct size_sym *symsizes;
803 bfd_byte *from, *fromend;
805 asymbol *store_sym, *store_next;
807 qsort (minisyms, symcount, size, size_forward1);
809 /* We are going to return a special set of symbols and sizes to
811 symsizes = (struct size_sym *) xmalloc (symcount * sizeof (struct size_sym));
812 *symsizesp = symsizes;
814 /* Note that filter_symbols has already removed all absolute and
815 undefined symbols. Here we remove all symbols whose size winds
818 from = (bfd_byte *) minisyms;
819 fromend = from + symcount * size;
826 sym = bfd_minisymbol_to_symbol (abfd, dynamic, (const PTR) from,
829 bfd_fatal (bfd_get_filename (abfd));
832 for (; from < fromend; from += size)
839 if (from + size < fromend)
841 next = bfd_minisymbol_to_symbol (abfd,
843 (const PTR) (from + size),
846 bfd_fatal (bfd_get_filename (abfd));
851 sec = bfd_get_section (sym);
853 if (bfd_is_com_section (sec))
857 if (from + size < fromend
858 && sec == bfd_get_section (next))
859 sz = valueof (next) - valueof (sym);
861 sz = (bfd_get_section_vma (abfd, sec)
862 + bfd_section_size (abfd, sec)
868 symsizes->minisym = (const PTR) from;
876 store_sym = store_next;
880 symcount = symsizes - *symsizesp;
882 /* We must now sort again by size. */
883 qsort ((PTR) *symsizesp, symcount, sizeof (struct size_sym), size_forward2);
888 /* If ARCHIVE_BFD is non-NULL, it is the archive containing ABFD. */
891 display_rel_file (abfd, archive_bfd)
898 struct size_sym *symsizes;
902 if (!(bfd_get_file_flags (abfd) & HAS_SYMS))
904 fprintf (stderr, _("%s: no symbols\n"), bfd_get_filename (abfd));
909 symcount = bfd_read_minisymbols (abfd, dynamic, &minisyms, &size);
911 bfd_fatal (bfd_get_filename (abfd));
915 fprintf (stderr, _("%s: no symbols\n"), bfd_get_filename (abfd));
919 /* Discard the symbols we don't want to print.
920 It's OK to do this in place; we'll free the storage anyway
923 symcount = filter_symbols (abfd, dynamic, minisyms, symcount, size);
929 sort_dynamic = dynamic;
930 sort_x = bfd_make_empty_symbol (abfd);
931 sort_y = bfd_make_empty_symbol (abfd);
932 if (sort_x == NULL || sort_y == NULL)
933 bfd_fatal (bfd_get_filename (abfd));
936 qsort (minisyms, symcount, size,
937 sorters[sort_numerically][reverse_sort]);
939 symcount = sort_symbols_by_size (abfd, dynamic, minisyms, symcount,
944 print_symbols (abfd, dynamic, minisyms, symcount, size, archive_bfd);
946 print_size_symbols (abfd, dynamic, symsizes, symcount, archive_bfd);
951 /* Choose which symbol entries to print;
952 compact them downward to get rid of the rest.
953 Return the number of symbols to be printed. */
956 filter_symbols (abfd, dynamic, minisyms, symcount, size)
963 bfd_byte *from, *fromend, *to;
966 store = bfd_make_empty_symbol (abfd);
968 bfd_fatal (bfd_get_filename (abfd));
970 from = (bfd_byte *) minisyms;
971 fromend = from + symcount * size;
972 to = (bfd_byte *) minisyms;
974 for (; from < fromend; from += size)
981 sym = bfd_minisymbol_to_symbol (abfd, dynamic, (const PTR) from, store);
983 bfd_fatal (bfd_get_filename (abfd));
986 keep = bfd_is_und_section (sym->section);
987 else if (external_only)
988 keep = ((sym->flags & BSF_GLOBAL) != 0
989 || (sym->flags & BSF_WEAK) != 0
990 || bfd_is_und_section (sym->section)
991 || bfd_is_com_section (sym->section));
996 && ! print_debug_syms
997 && (sym->flags & BSF_DEBUGGING) != 0)
1002 && (bfd_is_abs_section (sym->section)
1003 || bfd_is_und_section (sym->section)))
1009 if (bfd_is_und_section (sym->section))
1015 memcpy (to, from, size);
1020 return (to - (bfd_byte *) minisyms) / size;
1023 /* Print symbol name NAME, read from ABFD, with printf format FORMAT,
1024 demangling it if requested. */
1027 print_symname (format, name, abfd)
1032 if (do_demangle && *name)
1036 /* In this mode, give a user-level view of the symbol name
1037 even if it's not mangled; strip off any leading
1039 if (bfd_get_symbol_leading_char (abfd) == name[0])
1042 res = cplus_demangle (name, DMGL_ANSI | DMGL_PARAMS);
1045 printf (format, res);
1051 printf (format, name);
1054 /* Print the symbols. If ARCHIVE_BFD is non-NULL, it is the archive
1058 print_symbols (abfd, dynamic, minisyms, symcount, size, archive_bfd)
1067 bfd_byte *from, *fromend;
1069 store = bfd_make_empty_symbol (abfd);
1071 bfd_fatal (bfd_get_filename (abfd));
1073 from = (bfd_byte *) minisyms;
1074 fromend = from + symcount * size;
1075 for (; from < fromend; from += size)
1079 sym = bfd_minisymbol_to_symbol (abfd, dynamic, from, store);
1081 bfd_fatal (bfd_get_filename (abfd));
1083 print_symbol (abfd, sym, archive_bfd);
1087 /* Print the symbols when sorting by size. */
1090 print_size_symbols (abfd, dynamic, symsizes, symcount, archive_bfd)
1093 struct size_sym *symsizes;
1098 struct size_sym *from, *fromend;
1100 store = bfd_make_empty_symbol (abfd);
1102 bfd_fatal (bfd_get_filename (abfd));
1105 fromend = from + symcount;
1106 for (; from < fromend; from++)
1110 sym = bfd_minisymbol_to_symbol (abfd, dynamic, from->minisym, store);
1112 bfd_fatal (bfd_get_filename (abfd));
1114 /* Set the symbol value so that we actually display the symbol
1116 sym->value = from->size - bfd_section_vma (abfd, bfd_get_section (sym));
1118 print_symbol (abfd, sym, archive_bfd);
1122 /* Print a single symbol. */
1125 print_symbol (abfd, sym, archive_bfd)
1132 (*format->print_symbol_filename) (archive_bfd, abfd);
1136 if (bfd_is_und_section (bfd_get_section (sym)))
1137 print_symname ("%s", bfd_asymbol_name (sym), abfd);
1141 symbol_info syminfo;
1143 bfd_get_symbol_info (abfd, sym, &syminfo);
1144 (*format->print_symbol_info) (&syminfo, abfd);
1149 static asymbol **syms;
1150 static long symcount;
1151 const char *filename, *functionname;
1152 unsigned int lineno;
1154 /* We need to get the canonical symbols in order to call
1155 bfd_find_nearest_line. This is inefficient, but, then, you
1156 don't have to use --line-numbers. */
1157 if (abfd != lineno_cache_bfd && syms != NULL)
1166 symsize = bfd_get_symtab_upper_bound (abfd);
1168 bfd_fatal (bfd_get_filename (abfd));
1169 syms = (asymbol **) xmalloc (symsize);
1170 symcount = bfd_canonicalize_symtab (abfd, syms);
1172 bfd_fatal (bfd_get_filename (abfd));
1173 lineno_cache_bfd = abfd;
1176 if (bfd_is_und_section (bfd_get_section (sym)))
1178 static asection **secs;
1179 static arelent ***relocs;
1180 static long *relcount;
1181 static unsigned int seccount;
1183 const char *symname;
1185 /* For an undefined symbol, we try to find a reloc for the
1186 symbol, and print the line number of the reloc. */
1188 if (abfd != lineno_cache_rel_bfd && relocs != NULL)
1190 for (i = 0; i < seccount; i++)
1191 if (relocs[i] != NULL)
1203 struct get_relocs_info info;
1205 seccount = bfd_count_sections (abfd);
1207 secs = (asection **) xmalloc (seccount * sizeof *secs);
1208 relocs = (arelent ***) xmalloc (seccount * sizeof *relocs);
1209 relcount = (long *) xmalloc (seccount * sizeof *relcount);
1212 info.relocs = relocs;
1213 info.relcount = relcount;
1215 bfd_map_over_sections (abfd, get_relocs, (PTR) &info);
1216 lineno_cache_rel_bfd = abfd;
1219 symname = bfd_asymbol_name (sym);
1220 for (i = 0; i < seccount; i++)
1224 for (j = 0; j < relcount[i]; j++)
1229 if (r->sym_ptr_ptr != NULL
1230 && (*r->sym_ptr_ptr)->section == sym->section
1231 && (*r->sym_ptr_ptr)->value == sym->value
1233 bfd_asymbol_name (*r->sym_ptr_ptr)) == 0
1234 && bfd_find_nearest_line (abfd, secs[i], syms,
1235 r->address, &filename,
1236 &functionname, &lineno))
1238 /* We only print the first one we find. */
1239 printf ("\t%s:%u", filename, lineno);
1246 else if (bfd_get_section (sym)->owner == abfd)
1248 if (bfd_find_nearest_line (abfd, bfd_get_section (sym), syms,
1249 sym->value, &filename, &functionname,
1254 printf ("\t%s:%u", filename, lineno);
1262 /* The following 3 groups of functions are called unconditionally,
1263 once at the start of processing each file of the appropriate type.
1264 They should check `filename_per_file' and `filename_per_symbol',
1265 as appropriate for their output format, to determine whether to
1268 /* Print the name of an object file given on the command line. */
1271 print_object_filename_bsd (filename)
1274 if (filename_per_file && !filename_per_symbol)
1275 printf ("\n%s:\n", filename);
1279 print_object_filename_sysv (filename)
1283 printf (_("\n\nUndefined symbols from %s:\n\n"), filename);
1285 printf (_("\n\nSymbols from %s:\n\n"), filename);
1287 Name Value Class Type Size Line Section\n\n"));
1291 print_object_filename_posix (filename)
1294 if (filename_per_file && !filename_per_symbol)
1295 printf ("%s:\n", filename);
1298 /* Print the name of an archive file given on the command line. */
1301 print_archive_filename_bsd (filename)
1304 if (filename_per_file)
1305 printf ("\n%s:\n", filename);
1309 print_archive_filename_sysv (filename)
1310 char *filename ATTRIBUTE_UNUSED;
1315 print_archive_filename_posix (filename)
1316 char *filename ATTRIBUTE_UNUSED;
1320 /* Print the name of an archive member file. */
1323 print_archive_member_bsd (archive, filename)
1324 char *archive ATTRIBUTE_UNUSED;
1325 CONST char *filename;
1327 if (!filename_per_symbol)
1328 printf ("\n%s:\n", filename);
1332 print_archive_member_sysv (archive, filename)
1334 CONST char *filename;
1337 printf (_("\n\nUndefined symbols from %s[%s]:\n\n"), archive, filename);
1339 printf (_("\n\nSymbols from %s[%s]:\n\n"), archive, filename);
1341 Name Value Class Type Size Line Section\n\n"));
1345 print_archive_member_posix (archive, filename)
1347 CONST char *filename;
1349 if (!filename_per_symbol)
1350 printf ("%s[%s]:\n", archive, filename);
1353 /* Print the name of the file (and archive, if there is one)
1354 containing a symbol. */
1357 print_symbol_filename_bsd (archive_bfd, abfd)
1358 bfd *archive_bfd, *abfd;
1360 if (filename_per_symbol)
1363 printf ("%s:", bfd_get_filename (archive_bfd));
1364 printf ("%s:", bfd_get_filename (abfd));
1369 print_symbol_filename_sysv (archive_bfd, abfd)
1370 bfd *archive_bfd, *abfd;
1372 if (filename_per_symbol)
1375 printf ("%s:", bfd_get_filename (archive_bfd));
1376 printf ("%s:", bfd_get_filename (abfd));
1381 print_symbol_filename_posix (archive_bfd, abfd)
1382 bfd *archive_bfd, *abfd;
1384 if (filename_per_symbol)
1387 printf ("%s[%s]: ", bfd_get_filename (archive_bfd),
1388 bfd_get_filename (abfd));
1390 printf ("%s: ", bfd_get_filename (abfd));
1394 /* Print a symbol value. */
1400 #if ! defined (BFD64) || BFD_HOST_64BIT_LONG
1401 printf (value_format, val);
1403 /* We have a 64 bit value to print, but the host is only 32 bit. */
1404 if (print_radix == 16)
1405 fprintf_vma (stdout, val);
1411 s = buf + sizeof buf;
1415 *--s = (val % print_radix) + '0';
1418 while ((buf + sizeof buf - 1) - s < 16)
1425 /* Print a line of information about a symbol. */
1428 print_symbol_info_bsd (info, abfd)
1432 if (bfd_is_undefined_symclass (info->type))
1443 print_value (info->value);
1444 printf (" %c", info->type);
1445 if (info->type == '-')
1449 printf (other_format, info->stab_other);
1451 printf (desc_format, info->stab_desc);
1452 printf (" %5s", info->stab_name);
1454 print_symname (" %s", info->name, abfd);
1458 print_symbol_info_sysv (info, abfd)
1462 print_symname ("%-20s|", info->name, abfd); /* Name */
1463 if (bfd_is_undefined_symclass (info->type))
1464 printf (" "); /* Value */
1466 print_value (info->value);
1467 printf ("| %c |", info->type); /* Class */
1468 if (info->type == '-')
1471 printf ("%18s| ", info->stab_name); /* (C) Type */
1472 printf (desc_format, info->stab_desc); /* Size */
1473 printf ("| |"); /* Line, Section */
1476 printf (" | | |"); /* Type, Size, Line, Section */
1480 print_symbol_info_posix (info, abfd)
1484 print_symname ("%s ", info->name, abfd);
1485 printf ("%c ", info->type);
1486 if (bfd_is_undefined_symclass (info->type))
1489 print_value (info->value);
1490 /* POSIX.2 wants the symbol size printed here, when applicable;
1491 BFD currently doesn't provide it, so we take the easy way out by
1492 considering it to never be applicable. */
1496 print_symdef_entry (abfd)
1499 symindex idx = BFD_NO_MORE_SYMBOLS;
1501 boolean everprinted = false;
1503 for (idx = bfd_get_next_mapent (abfd, idx, &thesym);
1504 idx != BFD_NO_MORE_SYMBOLS;
1505 idx = bfd_get_next_mapent (abfd, idx, &thesym))
1510 printf (_("\nArchive index:\n"));
1513 elt = bfd_get_elt_at_index (abfd, idx);
1515 bfd_fatal ("bfd_get_elt_at_index");
1516 if (thesym->name != (char *) NULL)
1518 print_symname ("%s", thesym->name, abfd);
1519 printf (" in %s\n", bfd_get_filename (elt));
1524 /* This function is used to get the relocs for a particular section.
1525 It is called via bfd_map_over_sections. */
1528 get_relocs (abfd, sec, dataarg)
1533 struct get_relocs_info *data = (struct get_relocs_info *) dataarg;
1537 if ((sec->flags & SEC_RELOC) == 0)
1539 *data->relocs = NULL;
1540 *data->relcount = 0;
1546 relsize = bfd_get_reloc_upper_bound (abfd, sec);
1548 bfd_fatal (bfd_get_filename (abfd));
1550 *data->relocs = (arelent **) xmalloc (relsize);
1551 *data->relcount = bfd_canonicalize_reloc (abfd, sec, *data->relocs,
1553 if (*data->relcount < 0)
1554 bfd_fatal (bfd_get_filename (abfd));