* lexsup.c (parse_args): Don't pass shortopts to second call to
[binutils.git] / binutils / nm.c
blobe6cc368e815d8fa7d8f8823cb54931fa9c3ccc05
1 /* nm.c -- Describe symbol table of a rel file.
2 Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
3 2001
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
21 02111-1307, USA. */
23 #include "bfd.h"
24 #include "progress.h"
25 #include "bucomm.h"
26 #include "getopt.h"
27 #include "aout/stab_gnu.h"
28 #include "aout/ranlib.h"
29 #include "demangle.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. */
35 struct size_sym
37 const PTR minisym;
38 bfd_vma size;
41 /* When fetching relocs, we use this structure to pass information to
42 get_relocs. */
44 struct get_relocs_info
46 asection **secs;
47 arelent ***relocs;
48 long *relcount;
49 asymbol **syms;
52 static void
53 usage PARAMS ((FILE *, int));
55 static void
56 set_print_radix PARAMS ((char *));
58 static void
59 set_output_format PARAMS ((char *));
61 static void
62 display_archive PARAMS ((bfd *));
64 static boolean
65 display_file PARAMS ((char *filename));
67 static void
68 display_rel_file PARAMS ((bfd * file, bfd * archive));
70 static long
71 filter_symbols PARAMS ((bfd *, boolean, PTR, long, unsigned int));
73 static long
74 sort_symbols_by_size PARAMS ((bfd *, boolean, PTR, long, unsigned int,
75 struct size_sym **));
77 static void
78 print_symbols PARAMS ((bfd *, boolean, PTR, long, unsigned int, bfd *));
80 static void
81 print_size_symbols PARAMS ((bfd *, boolean, struct size_sym *, long, bfd *));
83 static void
84 print_symname PARAMS ((const char *, const char *, bfd *));
86 static void
87 print_symbol PARAMS ((bfd *, asymbol *, bfd *));
89 static void
90 print_symdef_entry PARAMS ((bfd * abfd));
92 /* The sorting functions. */
94 static int
95 numeric_forward PARAMS ((const PTR, const PTR));
97 static int
98 numeric_reverse PARAMS ((const PTR, const PTR));
100 static int
101 non_numeric_forward PARAMS ((const PTR, const PTR));
103 static int
104 non_numeric_reverse PARAMS ((const PTR, const PTR));
106 static int
107 size_forward1 PARAMS ((const PTR, const PTR));
109 static int
110 size_forward2 PARAMS ((const PTR, const PTR));
112 /* The output formatting functions. */
114 static void
115 print_object_filename_bsd PARAMS ((char *filename));
117 static void
118 print_object_filename_sysv PARAMS ((char *filename));
120 static void
121 print_object_filename_posix PARAMS ((char *filename));
124 static void
125 print_archive_filename_bsd PARAMS ((char *filename));
127 static void
128 print_archive_filename_sysv PARAMS ((char *filename));
130 static void
131 print_archive_filename_posix PARAMS ((char *filename));
134 static void
135 print_archive_member_bsd PARAMS ((char *archive, CONST char *filename));
137 static void
138 print_archive_member_sysv PARAMS ((char *archive, CONST char *filename));
140 static void
141 print_archive_member_posix PARAMS ((char *archive, CONST char *filename));
144 static void
145 print_symbol_filename_bsd PARAMS ((bfd * archive_bfd, bfd * abfd));
147 static void
148 print_symbol_filename_sysv PARAMS ((bfd * archive_bfd, bfd * abfd));
150 static void
151 print_symbol_filename_posix PARAMS ((bfd * archive_bfd, bfd * abfd));
154 static void
155 print_value PARAMS ((bfd *, bfd_vma));
157 static void
158 print_symbol_info_bsd PARAMS ((symbol_info * info, bfd * abfd));
160 static void
161 print_symbol_info_sysv PARAMS ((symbol_info * info, bfd * abfd));
163 static void
164 print_symbol_info_posix PARAMS ((symbol_info * info, bfd * abfd));
166 static void
167 get_relocs PARAMS ((bfd *, asection *, PTR));
169 /* Support for different output formats. */
170 struct output_fns
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'. */
208 #define FORMAT_BSD 0
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. */
239 #ifndef BFD64
240 static char value_format[] = "%08lx";
241 #else
242 #if BFD_HOST_64BIT_LONG
243 static char value_format[] = "%016lx";
244 #else
245 /* We don't use value_format for this case. */
246 #endif
247 #endif
248 #ifdef BFD64
249 static int print_width = 16;
250 #else
251 static int print_width = 8;
252 #endif
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 */
295 static void
296 usage (stream, status)
297 FILE *stream;
298 int 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\
312 -e (ignored)\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\
320 -o Same as -A\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\
331 \n"));
332 list_supported_targets (program_name, stream);
333 if (status == 0)
334 fprintf (stream, _("Report bugs to %s.\n"), REPORT_BUGS_TO);
335 exit (status);
338 /* Set the radix for the symbol value and size according to RADIX. */
340 static void
341 set_print_radix (radix)
342 char *radix;
344 switch (*radix)
346 case 'x':
347 break;
348 case 'd':
349 case 'o':
350 if (*radix == 'd')
351 print_radix = 10;
352 else
353 print_radix = 8;
354 #ifndef BFD64
355 value_format[4] = *radix;
356 #else
357 #if BFD_HOST_64BIT_LONG
358 value_format[5] = *radix;
359 #else
360 /* This case requires special handling for octal and decimal
361 printing. */
362 #endif
363 #endif
364 other_format[3] = desc_format[3] = *radix;
365 break;
366 default:
367 fatal (_("%s: invalid radix"), radix);
371 static void
372 set_output_format (f)
373 char *f;
375 int i;
377 switch (*f)
379 case 'b':
380 case 'B':
381 i = FORMAT_BSD;
382 break;
383 case 'p':
384 case 'P':
385 i = FORMAT_POSIX;
386 break;
387 case 's':
388 case 'S':
389 i = FORMAT_SYSV;
390 break;
391 default:
392 fatal (_("%s: invalid output format"), f);
394 format = &formats[i];
398 main (argc, argv)
399 int argc;
400 char **argv;
402 int c;
403 int retval;
405 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
406 setlocale (LC_MESSAGES, "");
407 #endif
408 #if defined (HAVE_SETLOCALE)
409 setlocale (LC_CTYPE, "");
410 #endif
411 bindtextdomain (PACKAGE, LOCALEDIR);
412 textdomain (PACKAGE);
414 program_name = *argv;
415 xmalloc_set_program_name (program_name);
417 START_PROGRESS (program_name, 0);
419 bfd_init ();
420 set_default_bfd_target ();
422 while ((c = getopt_long (argc, argv, "aABCDef:glnopPrst:uvVX:",
423 long_options, (int *) 0)) != EOF)
425 switch (c)
427 case 'a':
428 print_debug_syms = 1;
429 break;
430 case 'A':
431 case 'o':
432 filename_per_symbol = 1;
433 break;
434 case 'B': /* For MIPS compatibility. */
435 set_output_format ("bsd");
436 break;
437 case 'C':
438 do_demangle = 1;
439 if (optarg != NULL)
441 enum demangling_styles style;
443 style = cplus_demangle_name_to_style (optarg);
444 if (style == unknown_demangling)
445 fatal (_("unknown demangling style `%s'"),
446 optarg);
448 cplus_demangle_set_style (style);
450 break;
451 case 'D':
452 dynamic = 1;
453 break;
454 case 'e':
455 /* Ignored for HP/UX compatibility. */
456 break;
457 case 'f':
458 set_output_format (optarg);
459 break;
460 case 'g':
461 external_only = 1;
462 break;
463 case 'h':
464 usage (stdout, 0);
465 case 'l':
466 line_numbers = 1;
467 break;
468 case 'n':
469 case 'v':
470 sort_numerically = 1;
471 break;
472 case 'p':
473 no_sort = 1;
474 break;
475 case 'P':
476 set_output_format ("posix");
477 break;
478 case 'r':
479 reverse_sort = 1;
480 break;
481 case 's':
482 print_armap = 1;
483 break;
484 case 't':
485 set_print_radix (optarg);
486 break;
487 case 'u':
488 undefined_only = 1;
489 break;
490 case 'V':
491 show_version = 1;
492 break;
493 case 'X':
494 /* Ignored for (partial) AIX compatibility. On AIX, the
495 argument has values 32, 64, or 32_64, and specfies that
496 only 32-bit, only 64-bit, or both kinds of objects should
497 be examined. The default is 32. So plain AIX nm on a
498 library archive with both kinds of objects will ignore
499 the 64-bit ones. For GNU nm, the default is and always
500 has been -X 32_64, and other options are not supported. */
501 if (strcmp (optarg, "32_64") != 0)
502 fatal (_("Only -X 32_64 is supported"));
503 break;
505 case OPTION_TARGET: /* --target */
506 target = optarg;
507 break;
509 case 0: /* A long option that just sets a flag. */
510 break;
512 default:
513 usage (stderr, 1);
517 if (show_version)
518 print_version ("nm");
520 /* OK, all options now parsed. If no filename specified, do a.out. */
521 if (optind == argc)
522 return !display_file ("a.out");
524 retval = 0;
526 if (argc - optind > 1)
527 filename_per_file = 1;
529 /* We were given several filenames to do. */
530 while (optind < argc)
532 PROGRESS (1);
533 if (!display_file (argv[optind++]))
534 retval++;
537 END_PROGRESS (program_name);
539 #ifdef HAVE_SBRK
540 if (show_stats)
542 char *lim = (char *) sbrk (0);
544 non_fatal (_("data size %ld"), (long) (lim - (char *) &environ));
546 #endif
548 exit (retval);
549 return retval;
552 static void
553 display_archive (file)
554 bfd *file;
556 bfd *arfile = NULL;
557 bfd *last_arfile = NULL;
558 char **matching;
560 (*format->print_archive_filename) (bfd_get_filename (file));
562 if (print_armap)
563 print_symdef_entry (file);
565 for (;;)
567 PROGRESS (1);
569 arfile = bfd_openr_next_archived_file (file, arfile);
571 if (arfile == NULL)
573 if (bfd_get_error () != bfd_error_no_more_archived_files)
574 bfd_fatal (bfd_get_filename (file));
575 break;
578 if (bfd_check_format_matches (arfile, bfd_object, &matching))
580 (*format->print_archive_member) (bfd_get_filename (file),
581 bfd_get_filename (arfile));
582 display_rel_file (arfile, file);
584 else
586 bfd_nonfatal (bfd_get_filename (arfile));
587 if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
589 list_matching_formats (matching);
590 free (matching);
594 if (last_arfile != NULL)
596 bfd_close (last_arfile);
597 lineno_cache_bfd = NULL;
598 lineno_cache_rel_bfd = NULL;
600 last_arfile = arfile;
603 if (last_arfile != NULL)
605 bfd_close (last_arfile);
606 lineno_cache_bfd = NULL;
607 lineno_cache_rel_bfd = NULL;
611 static boolean
612 display_file (filename)
613 char *filename;
615 boolean retval = true;
616 bfd *file;
617 char **matching;
619 file = bfd_openr (filename, target);
620 if (file == NULL)
622 bfd_nonfatal (filename);
623 return false;
626 if (bfd_check_format (file, bfd_archive))
628 display_archive (file);
630 else if (bfd_check_format_matches (file, bfd_object, &matching))
632 (*format->print_object_filename) (filename);
633 display_rel_file (file, NULL);
635 else
637 bfd_nonfatal (filename);
638 if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
640 list_matching_formats (matching);
641 free (matching);
643 retval = false;
646 if (bfd_close (file) == false)
647 bfd_fatal (filename);
649 lineno_cache_bfd = NULL;
650 lineno_cache_rel_bfd = NULL;
652 return retval;
655 /* These globals are used to pass information into the sorting
656 routines. */
657 static bfd *sort_bfd;
658 static boolean sort_dynamic;
659 static asymbol *sort_x;
660 static asymbol *sort_y;
662 /* Symbol-sorting predicates */
663 #define valueof(x) ((x)->section->vma + (x)->value)
665 /* Numeric sorts. Undefined symbols are always considered "less than"
666 defined symbols with zero values. Common symbols are not treated
667 specially -- i.e., their sizes are used as their "values". */
669 static int
670 numeric_forward (P_x, P_y)
671 const PTR P_x;
672 const PTR P_y;
674 asymbol *x, *y;
675 asection *xs, *ys;
677 x = bfd_minisymbol_to_symbol (sort_bfd, sort_dynamic, P_x, sort_x);
678 y = bfd_minisymbol_to_symbol (sort_bfd, sort_dynamic, P_y, sort_y);
679 if (x == NULL || y == NULL)
680 bfd_fatal (bfd_get_filename (sort_bfd));
682 xs = bfd_get_section (x);
683 ys = bfd_get_section (y);
685 if (bfd_is_und_section (xs))
687 if (! bfd_is_und_section (ys))
688 return -1;
690 else if (bfd_is_und_section (ys))
691 return 1;
692 else if (valueof (x) != valueof (y))
693 return valueof (x) < valueof (y) ? -1 : 1;
695 return non_numeric_forward (P_x, P_y);
698 static int
699 numeric_reverse (x, y)
700 const PTR x;
701 const PTR y;
703 return - numeric_forward (x, y);
706 static int
707 non_numeric_forward (P_x, P_y)
708 const PTR P_x;
709 const PTR P_y;
711 asymbol *x, *y;
712 const char *xn, *yn;
714 x = bfd_minisymbol_to_symbol (sort_bfd, sort_dynamic, P_x, sort_x);
715 y = bfd_minisymbol_to_symbol (sort_bfd, sort_dynamic, P_y, sort_y);
716 if (x == NULL || y == NULL)
717 bfd_fatal (bfd_get_filename (sort_bfd));
719 xn = bfd_asymbol_name (x);
720 yn = bfd_asymbol_name (y);
722 return ((xn == NULL) ? ((yn == NULL) ? 0 : -1) :
723 ((yn == NULL) ? 1 : strcmp (xn, yn)));
726 static int
727 non_numeric_reverse (x, y)
728 const PTR x;
729 const PTR y;
731 return - non_numeric_forward (x, y);
734 static int (*(sorters[2][2])) PARAMS ((const PTR, const PTR)) =
736 { non_numeric_forward, non_numeric_reverse },
737 { numeric_forward, numeric_reverse }
740 /* This sort routine is used by sort_symbols_by_size. It is similar
741 to numeric_forward, but when symbols have the same value it sorts
742 by section VMA. This simplifies the sort_symbols_by_size code
743 which handles symbols at the end of sections. Also, this routine
744 tries to sort file names before other symbols with the same value.
745 That will make the file name have a zero size, which will make
746 sort_symbols_by_size choose the non file name symbol, leading to
747 more meaningful output. For similar reasons, this code sorts
748 gnu_compiled_* and gcc2_compiled before other symbols with the same
749 value. */
751 static int
752 size_forward1 (P_x, P_y)
753 const PTR P_x;
754 const PTR P_y;
756 asymbol *x, *y;
757 asection *xs, *ys;
758 const char *xn, *yn;
759 size_t xnl, ynl;
760 int xf, yf;
762 x = bfd_minisymbol_to_symbol (sort_bfd, sort_dynamic, P_x, sort_x);
763 y = bfd_minisymbol_to_symbol (sort_bfd, sort_dynamic, P_y, sort_y);
764 if (x == NULL || y == NULL)
765 bfd_fatal (bfd_get_filename (sort_bfd));
767 xs = bfd_get_section (x);
768 ys = bfd_get_section (y);
770 if (bfd_is_und_section (xs))
771 abort ();
772 if (bfd_is_und_section (ys))
773 abort ();
775 if (valueof (x) != valueof (y))
776 return valueof (x) < valueof (y) ? -1 : 1;
778 if (xs->vma != ys->vma)
779 return xs->vma < ys->vma ? -1 : 1;
781 xn = bfd_asymbol_name (x);
782 yn = bfd_asymbol_name (y);
783 xnl = strlen (xn);
784 ynl = strlen (yn);
786 /* The symbols gnu_compiled and gcc2_compiled convey even less
787 information than the file name, so sort them out first. */
789 xf = (strstr (xn, "gnu_compiled") != NULL
790 || strstr (xn, "gcc2_compiled") != NULL);
791 yf = (strstr (yn, "gnu_compiled") != NULL
792 || strstr (yn, "gcc2_compiled") != NULL);
794 if (xf && ! yf)
795 return -1;
796 if (! xf && yf)
797 return 1;
799 /* We use a heuristic for the file name. It may not work on non
800 Unix systems, but it doesn't really matter; the only difference
801 is precisely which symbol names get printed. */
803 #define file_symbol(s, sn, snl) \
804 (((s)->flags & BSF_FILE) != 0 \
805 || ((sn)[(snl) - 2] == '.' \
806 && ((sn)[(snl) - 1] == 'o' \
807 || (sn)[(snl) - 1] == 'a')))
809 xf = file_symbol (x, xn, xnl);
810 yf = file_symbol (y, yn, ynl);
812 if (xf && ! yf)
813 return -1;
814 if (! xf && yf)
815 return 1;
817 return non_numeric_forward (P_x, P_y);
820 /* This sort routine is used by sort_symbols_by_size. It is sorting
821 an array of size_sym structures into size order. */
823 static int
824 size_forward2 (P_x, P_y)
825 const PTR P_x;
826 const PTR P_y;
828 const struct size_sym *x = (const struct size_sym *) P_x;
829 const struct size_sym *y = (const struct size_sym *) P_y;
831 if (x->size < y->size)
832 return reverse_sort ? 1 : -1;
833 else if (x->size > y->size)
834 return reverse_sort ? -1 : 1;
835 else
836 return sorters[0][reverse_sort] (x->minisym, y->minisym);
839 /* Sort the symbols by size. We guess the size by assuming that the
840 difference between the address of a symbol and the address of the
841 next higher symbol is the size. FIXME: ELF actually stores a size
842 with each symbol. We should use it. */
844 static long
845 sort_symbols_by_size (abfd, dynamic, minisyms, symcount, size, symsizesp)
846 bfd *abfd;
847 boolean dynamic;
848 PTR minisyms;
849 long symcount;
850 unsigned int size;
851 struct size_sym **symsizesp;
853 struct size_sym *symsizes;
854 bfd_byte *from, *fromend;
855 asymbol *sym = NULL;
856 asymbol *store_sym, *store_next;
858 qsort (minisyms, symcount, size, size_forward1);
860 /* We are going to return a special set of symbols and sizes to
861 print. */
862 symsizes = (struct size_sym *) xmalloc (symcount * sizeof (struct size_sym));
863 *symsizesp = symsizes;
865 /* Note that filter_symbols has already removed all absolute and
866 undefined symbols. Here we remove all symbols whose size winds
867 up as zero. */
869 from = (bfd_byte *) minisyms;
870 fromend = from + symcount * size;
872 store_sym = sort_x;
873 store_next = sort_y;
875 if (from < fromend)
877 sym = bfd_minisymbol_to_symbol (abfd, dynamic, (const PTR) from,
878 store_sym);
879 if (sym == NULL)
880 bfd_fatal (bfd_get_filename (abfd));
883 for (; from < fromend; from += size)
885 asymbol *next;
886 asection *sec;
887 bfd_vma sz;
888 asymbol *temp;
890 if (from + size < fromend)
892 next = bfd_minisymbol_to_symbol (abfd,
893 dynamic,
894 (const PTR) (from + size),
895 store_next);
896 if (next == NULL)
897 bfd_fatal (bfd_get_filename (abfd));
899 else
900 next = NULL;
902 sec = bfd_get_section (sym);
904 if (bfd_is_com_section (sec))
905 sz = sym->value;
906 else
908 if (from + size < fromend
909 && sec == bfd_get_section (next))
910 sz = valueof (next) - valueof (sym);
911 else
912 sz = (bfd_get_section_vma (abfd, sec)
913 + bfd_section_size (abfd, sec)
914 - valueof (sym));
917 if (sz != 0)
919 symsizes->minisym = (const PTR) from;
920 symsizes->size = sz;
921 ++symsizes;
924 sym = next;
926 temp = store_sym;
927 store_sym = store_next;
928 store_next = temp;
931 symcount = symsizes - *symsizesp;
933 /* We must now sort again by size. */
934 qsort ((PTR) *symsizesp, symcount, sizeof (struct size_sym), size_forward2);
936 return symcount;
939 /* If ARCHIVE_BFD is non-NULL, it is the archive containing ABFD. */
941 static void
942 display_rel_file (abfd, archive_bfd)
943 bfd *abfd;
944 bfd *archive_bfd;
946 long symcount;
947 PTR minisyms;
948 unsigned int size;
949 struct size_sym *symsizes;
950 char buf[30];
952 if (! dynamic)
954 if (!(bfd_get_file_flags (abfd) & HAS_SYMS))
956 non_fatal (_("%s: no symbols"), bfd_get_filename (abfd));
957 return;
961 symcount = bfd_read_minisymbols (abfd, dynamic, &minisyms, &size);
962 if (symcount < 0)
963 bfd_fatal (bfd_get_filename (abfd));
965 if (symcount == 0)
967 non_fatal (_("%s: no symbols"), bfd_get_filename (abfd));
968 return;
971 bfd_sprintf_vma (abfd, buf, (bfd_vma) -1);
972 print_width = strlen (buf);
974 /* Discard the symbols we don't want to print.
975 It's OK to do this in place; we'll free the storage anyway
976 (after printing). */
978 symcount = filter_symbols (abfd, dynamic, minisyms, symcount, size);
980 symsizes = NULL;
981 if (! no_sort)
983 sort_bfd = abfd;
984 sort_dynamic = dynamic;
985 sort_x = bfd_make_empty_symbol (abfd);
986 sort_y = bfd_make_empty_symbol (abfd);
987 if (sort_x == NULL || sort_y == NULL)
988 bfd_fatal (bfd_get_filename (abfd));
990 if (! sort_by_size)
991 qsort (minisyms, symcount, size,
992 sorters[sort_numerically][reverse_sort]);
993 else
994 symcount = sort_symbols_by_size (abfd, dynamic, minisyms, symcount,
995 size, &symsizes);
998 if (! sort_by_size)
999 print_symbols (abfd, dynamic, minisyms, symcount, size, archive_bfd);
1000 else
1001 print_size_symbols (abfd, dynamic, symsizes, symcount, archive_bfd);
1003 free (minisyms);
1006 /* Choose which symbol entries to print;
1007 compact them downward to get rid of the rest.
1008 Return the number of symbols to be printed. */
1010 static long
1011 filter_symbols (abfd, dynamic, minisyms, symcount, size)
1012 bfd *abfd;
1013 boolean dynamic;
1014 PTR minisyms;
1015 long symcount;
1016 unsigned int size;
1018 bfd_byte *from, *fromend, *to;
1019 asymbol *store;
1021 store = bfd_make_empty_symbol (abfd);
1022 if (store == NULL)
1023 bfd_fatal (bfd_get_filename (abfd));
1025 from = (bfd_byte *) minisyms;
1026 fromend = from + symcount * size;
1027 to = (bfd_byte *) minisyms;
1029 for (; from < fromend; from += size)
1031 int keep = 0;
1032 asymbol *sym;
1034 PROGRESS (1);
1036 sym = bfd_minisymbol_to_symbol (abfd, dynamic, (const PTR) from, store);
1037 if (sym == NULL)
1038 bfd_fatal (bfd_get_filename (abfd));
1040 if (undefined_only)
1041 keep = bfd_is_und_section (sym->section);
1042 else if (external_only)
1043 keep = ((sym->flags & BSF_GLOBAL) != 0
1044 || (sym->flags & BSF_WEAK) != 0
1045 || bfd_is_und_section (sym->section)
1046 || bfd_is_com_section (sym->section));
1047 else
1048 keep = 1;
1050 if (keep
1051 && ! print_debug_syms
1052 && (sym->flags & BSF_DEBUGGING) != 0)
1053 keep = 0;
1055 if (keep
1056 && sort_by_size
1057 && (bfd_is_abs_section (sym->section)
1058 || bfd_is_und_section (sym->section)))
1059 keep = 0;
1061 if (keep
1062 && defined_only)
1064 if (bfd_is_und_section (sym->section))
1065 keep = 0;
1068 if (keep)
1070 memcpy (to, from, size);
1071 to += size;
1075 return (to - (bfd_byte *) minisyms) / size;
1078 /* Print symbol name NAME, read from ABFD, with printf format FORMAT,
1079 demangling it if requested. */
1081 static void
1082 print_symname (format, name, abfd)
1083 const char *format;
1084 const char *name;
1085 bfd *abfd;
1087 if (do_demangle && *name)
1089 char *res;
1091 /* In this mode, give a user-level view of the symbol name
1092 even if it's not mangled; strip off any leading
1093 underscore. */
1094 if (bfd_get_symbol_leading_char (abfd) == name[0])
1095 name++;
1097 res = cplus_demangle (name, DMGL_ANSI | DMGL_PARAMS);
1098 if (res)
1100 printf (format, res);
1101 free (res);
1102 return;
1106 printf (format, name);
1109 /* Print the symbols. If ARCHIVE_BFD is non-NULL, it is the archive
1110 containing ABFD. */
1112 static void
1113 print_symbols (abfd, dynamic, minisyms, symcount, size, archive_bfd)
1114 bfd *abfd;
1115 boolean dynamic;
1116 PTR minisyms;
1117 long symcount;
1118 unsigned int size;
1119 bfd *archive_bfd;
1121 asymbol *store;
1122 bfd_byte *from, *fromend;
1124 store = bfd_make_empty_symbol (abfd);
1125 if (store == NULL)
1126 bfd_fatal (bfd_get_filename (abfd));
1128 from = (bfd_byte *) minisyms;
1129 fromend = from + symcount * size;
1130 for (; from < fromend; from += size)
1132 asymbol *sym;
1134 sym = bfd_minisymbol_to_symbol (abfd, dynamic, from, store);
1135 if (sym == NULL)
1136 bfd_fatal (bfd_get_filename (abfd));
1138 print_symbol (abfd, sym, archive_bfd);
1142 /* Print the symbols when sorting by size. */
1144 static void
1145 print_size_symbols (abfd, dynamic, symsizes, symcount, archive_bfd)
1146 bfd *abfd;
1147 boolean dynamic;
1148 struct size_sym *symsizes;
1149 long symcount;
1150 bfd *archive_bfd;
1152 asymbol *store;
1153 struct size_sym *from, *fromend;
1155 store = bfd_make_empty_symbol (abfd);
1156 if (store == NULL)
1157 bfd_fatal (bfd_get_filename (abfd));
1159 from = symsizes;
1160 fromend = from + symcount;
1161 for (; from < fromend; from++)
1163 asymbol *sym;
1165 sym = bfd_minisymbol_to_symbol (abfd, dynamic, from->minisym, store);
1166 if (sym == NULL)
1167 bfd_fatal (bfd_get_filename (abfd));
1169 /* Set the symbol value so that we actually display the symbol
1170 size. */
1171 sym->value = from->size - bfd_section_vma (abfd, bfd_get_section (sym));
1173 print_symbol (abfd, sym, archive_bfd);
1177 /* Print a single symbol. */
1179 static void
1180 print_symbol (abfd, sym, archive_bfd)
1181 bfd *abfd;
1182 asymbol *sym;
1183 bfd *archive_bfd;
1185 PROGRESS (1);
1187 (*format->print_symbol_filename) (archive_bfd, abfd);
1189 if (undefined_only)
1191 if (bfd_is_und_section (bfd_get_section (sym)))
1192 print_symname ("%s", bfd_asymbol_name (sym), abfd);
1194 else
1196 symbol_info syminfo;
1198 bfd_get_symbol_info (abfd, sym, &syminfo);
1199 (*format->print_symbol_info) (&syminfo, abfd);
1202 if (line_numbers)
1204 static asymbol **syms;
1205 static long symcount;
1206 const char *filename, *functionname;
1207 unsigned int lineno;
1209 /* We need to get the canonical symbols in order to call
1210 bfd_find_nearest_line. This is inefficient, but, then, you
1211 don't have to use --line-numbers. */
1212 if (abfd != lineno_cache_bfd && syms != NULL)
1214 free (syms);
1215 syms = NULL;
1217 if (syms == NULL)
1219 long symsize;
1221 symsize = bfd_get_symtab_upper_bound (abfd);
1222 if (symsize < 0)
1223 bfd_fatal (bfd_get_filename (abfd));
1224 syms = (asymbol **) xmalloc (symsize);
1225 symcount = bfd_canonicalize_symtab (abfd, syms);
1226 if (symcount < 0)
1227 bfd_fatal (bfd_get_filename (abfd));
1228 lineno_cache_bfd = abfd;
1231 if (bfd_is_und_section (bfd_get_section (sym)))
1233 static asection **secs;
1234 static arelent ***relocs;
1235 static long *relcount;
1236 static unsigned int seccount;
1237 unsigned int i;
1238 const char *symname;
1240 /* For an undefined symbol, we try to find a reloc for the
1241 symbol, and print the line number of the reloc. */
1243 if (abfd != lineno_cache_rel_bfd && relocs != NULL)
1245 for (i = 0; i < seccount; i++)
1246 if (relocs[i] != NULL)
1247 free (relocs[i]);
1248 free (secs);
1249 free (relocs);
1250 free (relcount);
1251 secs = NULL;
1252 relocs = NULL;
1253 relcount = NULL;
1256 if (relocs == NULL)
1258 struct get_relocs_info info;
1260 seccount = bfd_count_sections (abfd);
1262 secs = (asection **) xmalloc (seccount * sizeof *secs);
1263 relocs = (arelent ***) xmalloc (seccount * sizeof *relocs);
1264 relcount = (long *) xmalloc (seccount * sizeof *relcount);
1266 info.secs = secs;
1267 info.relocs = relocs;
1268 info.relcount = relcount;
1269 info.syms = syms;
1270 bfd_map_over_sections (abfd, get_relocs, (PTR) &info);
1271 lineno_cache_rel_bfd = abfd;
1274 symname = bfd_asymbol_name (sym);
1275 for (i = 0; i < seccount; i++)
1277 long j;
1279 for (j = 0; j < relcount[i]; j++)
1281 arelent *r;
1283 r = relocs[i][j];
1284 if (r->sym_ptr_ptr != NULL
1285 && (*r->sym_ptr_ptr)->section == sym->section
1286 && (*r->sym_ptr_ptr)->value == sym->value
1287 && strcmp (symname,
1288 bfd_asymbol_name (*r->sym_ptr_ptr)) == 0
1289 && bfd_find_nearest_line (abfd, secs[i], syms,
1290 r->address, &filename,
1291 &functionname, &lineno))
1293 /* We only print the first one we find. */
1294 printf ("\t%s:%u", filename, lineno);
1295 i = seccount;
1296 break;
1301 else if (bfd_get_section (sym)->owner == abfd)
1303 if (bfd_find_nearest_line (abfd, bfd_get_section (sym), syms,
1304 sym->value, &filename, &functionname,
1305 &lineno)
1306 && filename != NULL
1307 && lineno != 0)
1309 printf ("\t%s:%u", filename, lineno);
1314 putchar ('\n');
1317 /* The following 3 groups of functions are called unconditionally,
1318 once at the start of processing each file of the appropriate type.
1319 They should check `filename_per_file' and `filename_per_symbol',
1320 as appropriate for their output format, to determine whether to
1321 print anything. */
1323 /* Print the name of an object file given on the command line. */
1325 static void
1326 print_object_filename_bsd (filename)
1327 char *filename;
1329 if (filename_per_file && !filename_per_symbol)
1330 printf ("\n%s:\n", filename);
1333 static void
1334 print_object_filename_sysv (filename)
1335 char *filename;
1337 if (undefined_only)
1338 printf (_("\n\nUndefined symbols from %s:\n\n"), filename);
1339 else
1340 printf (_("\n\nSymbols from %s:\n\n"), filename);
1341 printf (_("\
1342 Name Value Class Type Size Line Section\n\n"));
1345 static void
1346 print_object_filename_posix (filename)
1347 char *filename;
1349 if (filename_per_file && !filename_per_symbol)
1350 printf ("%s:\n", filename);
1353 /* Print the name of an archive file given on the command line. */
1355 static void
1356 print_archive_filename_bsd (filename)
1357 char *filename;
1359 if (filename_per_file)
1360 printf ("\n%s:\n", filename);
1363 static void
1364 print_archive_filename_sysv (filename)
1365 char *filename ATTRIBUTE_UNUSED;
1369 static void
1370 print_archive_filename_posix (filename)
1371 char *filename ATTRIBUTE_UNUSED;
1375 /* Print the name of an archive member file. */
1377 static void
1378 print_archive_member_bsd (archive, filename)
1379 char *archive ATTRIBUTE_UNUSED;
1380 CONST char *filename;
1382 if (!filename_per_symbol)
1383 printf ("\n%s:\n", filename);
1386 static void
1387 print_archive_member_sysv (archive, filename)
1388 char *archive;
1389 CONST char *filename;
1391 if (undefined_only)
1392 printf (_("\n\nUndefined symbols from %s[%s]:\n\n"), archive, filename);
1393 else
1394 printf (_("\n\nSymbols from %s[%s]:\n\n"), archive, filename);
1395 printf (_("\
1396 Name Value Class Type Size Line Section\n\n"));
1399 static void
1400 print_archive_member_posix (archive, filename)
1401 char *archive;
1402 CONST char *filename;
1404 if (!filename_per_symbol)
1405 printf ("%s[%s]:\n", archive, filename);
1408 /* Print the name of the file (and archive, if there is one)
1409 containing a symbol. */
1411 static void
1412 print_symbol_filename_bsd (archive_bfd, abfd)
1413 bfd *archive_bfd, *abfd;
1415 if (filename_per_symbol)
1417 if (archive_bfd)
1418 printf ("%s:", bfd_get_filename (archive_bfd));
1419 printf ("%s:", bfd_get_filename (abfd));
1423 static void
1424 print_symbol_filename_sysv (archive_bfd, abfd)
1425 bfd *archive_bfd, *abfd;
1427 if (filename_per_symbol)
1429 if (archive_bfd)
1430 printf ("%s:", bfd_get_filename (archive_bfd));
1431 printf ("%s:", bfd_get_filename (abfd));
1435 static void
1436 print_symbol_filename_posix (archive_bfd, abfd)
1437 bfd *archive_bfd, *abfd;
1439 if (filename_per_symbol)
1441 if (archive_bfd)
1442 printf ("%s[%s]: ", bfd_get_filename (archive_bfd),
1443 bfd_get_filename (abfd));
1444 else
1445 printf ("%s: ", bfd_get_filename (abfd));
1449 /* Print a symbol value. */
1451 static void
1452 print_value (abfd, val)
1453 bfd *abfd;
1454 bfd_vma val;
1456 #if ! defined (BFD64) || BFD_HOST_64BIT_LONG
1457 printf (value_format, val);
1458 #else
1459 /* We have a 64 bit value to print, but the host is only 32 bit. */
1460 if (print_radix == 16)
1461 bfd_fprintf_vma (abfd, stdout, val);
1462 else
1464 char buf[30];
1465 char *s;
1467 s = buf + sizeof buf;
1468 *--s = '\0';
1469 while (val > 0)
1471 *--s = (val % print_radix) + '0';
1472 val /= print_radix;
1474 while ((buf + sizeof buf - 1) - s < 16)
1475 *--s = '0';
1476 printf ("%s", s);
1478 #endif
1481 /* Print a line of information about a symbol. */
1483 static void
1484 print_symbol_info_bsd (info, abfd)
1485 symbol_info *info;
1486 bfd *abfd;
1488 if (bfd_is_undefined_symclass (info->type))
1490 if (print_width == 16)
1491 printf (" ");
1492 printf (" ");
1494 else
1495 print_value (abfd, info->value);
1496 printf (" %c", info->type);
1497 if (info->type == '-')
1499 /* A stab. */
1500 printf (" ");
1501 printf (other_format, info->stab_other);
1502 printf (" ");
1503 printf (desc_format, info->stab_desc);
1504 printf (" %5s", info->stab_name);
1506 print_symname (" %s", info->name, abfd);
1509 static void
1510 print_symbol_info_sysv (info, abfd)
1511 symbol_info *info;
1512 bfd *abfd;
1514 print_symname ("%-20s|", info->name, abfd); /* Name */
1515 if (bfd_is_undefined_symclass (info->type))
1516 printf (" "); /* Value */
1517 else
1518 print_value (abfd, info->value);
1519 printf ("| %c |", info->type); /* Class */
1520 if (info->type == '-')
1522 /* A stab. */
1523 printf ("%18s| ", info->stab_name); /* (C) Type */
1524 printf (desc_format, info->stab_desc); /* Size */
1525 printf ("| |"); /* Line, Section */
1527 else
1528 printf (" | | |"); /* Type, Size, Line, Section */
1531 static void
1532 print_symbol_info_posix (info, abfd)
1533 symbol_info *info;
1534 bfd *abfd;
1536 print_symname ("%s ", info->name, abfd);
1537 printf ("%c ", info->type);
1538 if (bfd_is_undefined_symclass (info->type))
1539 printf (" ");
1540 else
1541 print_value (abfd, info->value);
1542 /* POSIX.2 wants the symbol size printed here, when applicable;
1543 BFD currently doesn't provide it, so we take the easy way out by
1544 considering it to never be applicable. */
1547 static void
1548 print_symdef_entry (abfd)
1549 bfd *abfd;
1551 symindex idx = BFD_NO_MORE_SYMBOLS;
1552 carsym *thesym;
1553 boolean everprinted = false;
1555 for (idx = bfd_get_next_mapent (abfd, idx, &thesym);
1556 idx != BFD_NO_MORE_SYMBOLS;
1557 idx = bfd_get_next_mapent (abfd, idx, &thesym))
1559 bfd *elt;
1560 if (!everprinted)
1562 printf (_("\nArchive index:\n"));
1563 everprinted = true;
1565 elt = bfd_get_elt_at_index (abfd, idx);
1566 if (elt == NULL)
1567 bfd_fatal ("bfd_get_elt_at_index");
1568 if (thesym->name != (char *) NULL)
1570 print_symname ("%s", thesym->name, abfd);
1571 printf (" in %s\n", bfd_get_filename (elt));
1576 /* This function is used to get the relocs for a particular section.
1577 It is called via bfd_map_over_sections. */
1579 static void
1580 get_relocs (abfd, sec, dataarg)
1581 bfd *abfd;
1582 asection *sec;
1583 PTR dataarg;
1585 struct get_relocs_info *data = (struct get_relocs_info *) dataarg;
1587 *data->secs = sec;
1589 if ((sec->flags & SEC_RELOC) == 0)
1591 *data->relocs = NULL;
1592 *data->relcount = 0;
1594 else
1596 long relsize;
1598 relsize = bfd_get_reloc_upper_bound (abfd, sec);
1599 if (relsize < 0)
1600 bfd_fatal (bfd_get_filename (abfd));
1602 *data->relocs = (arelent **) xmalloc (relsize);
1603 *data->relcount = bfd_canonicalize_reloc (abfd, sec, *data->relocs,
1604 data->syms);
1605 if (*data->relcount < 0)
1606 bfd_fatal (bfd_get_filename (abfd));
1609 ++data->secs;
1610 ++data->relocs;
1611 ++data->relcount;