]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - binutils/nm.c
2002-06-18 Chris Demetriou <cgd@broadcom.com>
[thirdparty/binutils-gdb.git] / binutils / nm.c
CommitLineData
252b5132 1/* nm.c -- Describe symbol table of a rel file.
8c2bc687 2 Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
6ab6b380 3 2001, 2002
252b5132
RH
4 Free Software Foundation, Inc.
5
6 This file is part of GNU Binutils.
7
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.
12
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.
17
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. */
22
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"
6ab6b380 31#include "elf-bfd.h"
252b5132
RH
32
33/* When sorting by size, we use this structure to hold the size and a
34 pointer to the minisymbol. */
35
36struct size_sym
37{
38 const PTR minisym;
39 bfd_vma size;
40};
41
42/* When fetching relocs, we use this structure to pass information to
43 get_relocs. */
44
45struct get_relocs_info
46{
47 asection **secs;
48 arelent ***relocs;
49 long *relcount;
50 asymbol **syms;
51};
52
977f7911
NC
53struct extended_symbol_info
54{
55 symbol_info *sinfo;
56 bfd_vma ssize;
57 /* FIXME: We should add more fields for Type, Line, Section. */
58};
59#define SYM_NAME(sym) (sym->sinfo->name)
60#define SYM_VALUE(sym) (sym->sinfo->value)
61#define SYM_TYPE(sym) (sym->sinfo->type)
62#define SYM_STAB_NAME(sym) (sym->sinfo->stab_name)
63#define SYM_STAB_DESC(sym) (sym->sinfo->stab_desc)
64#define SYM_STAB_OTHER(sym) (sym->sinfo->stab_other)
65#define SYM_SIZE(sym) (sym->ssize)
66
67static void usage PARAMS ((FILE *, int));
68static void set_print_radix PARAMS ((char *));
69static void set_output_format PARAMS ((char *));
70static void display_archive PARAMS ((bfd *));
71static boolean display_file PARAMS ((char *));
72static void display_rel_file PARAMS ((bfd *, bfd *));
73static long filter_symbols PARAMS ((bfd *, boolean, PTR, long, unsigned int));
74static long sort_symbols_by_size PARAMS ((bfd *, boolean, PTR, long, unsigned int, struct size_sym **));
75static void print_symbols PARAMS ((bfd *, boolean, PTR, long, unsigned int, bfd *));
76static void print_size_symbols PARAMS ((bfd *, boolean, struct size_sym *, long, bfd *));
77static void print_symname PARAMS ((const char *, const char *, bfd *));
78static void print_symbol PARAMS ((bfd *, asymbol *, bfd_vma ssize, bfd *));
79static void print_symdef_entry PARAMS ((bfd *));
252b5132
RH
80
81/* The sorting functions. */
977f7911
NC
82static int numeric_forward PARAMS ((const PTR, const PTR));
83static int numeric_reverse PARAMS ((const PTR, const PTR));
84static int non_numeric_forward PARAMS ((const PTR, const PTR));
85static int non_numeric_reverse PARAMS ((const PTR, const PTR));
86static int size_forward1 PARAMS ((const PTR, const PTR));
87static int size_forward2 PARAMS ((const PTR, const PTR));
252b5132
RH
88
89/* The output formatting functions. */
977f7911
NC
90static void print_object_filename_bsd PARAMS ((char *));
91static void print_object_filename_sysv PARAMS ((char *));
92static void print_object_filename_posix PARAMS ((char *));
93static void print_archive_filename_bsd PARAMS ((char *));
94static void print_archive_filename_sysv PARAMS ((char *));
95static void print_archive_filename_posix PARAMS ((char *));
96static void print_archive_member_bsd PARAMS ((char *, const char *));
97static void print_archive_member_sysv PARAMS ((char *, const char *));
98static void print_archive_member_posix PARAMS ((char *, const char *));
99static void print_symbol_filename_bsd PARAMS ((bfd *, bfd *));
100static void print_symbol_filename_sysv PARAMS ((bfd *, bfd *));
101static void print_symbol_filename_posix PARAMS ((bfd *, bfd *));
102static void print_value PARAMS ((bfd *, bfd_vma));
103static void print_symbol_info_bsd PARAMS ((struct extended_symbol_info *, bfd *));
104static void print_symbol_info_sysv PARAMS ((struct extended_symbol_info *, bfd *));
105static void print_symbol_info_posix PARAMS ((struct extended_symbol_info *, bfd *));
106static void get_relocs PARAMS ((bfd *, asection *, PTR));
252b5132
RH
107
108/* Support for different output formats. */
109struct output_fns
110 {
111 /* Print the name of an object file given on the command line. */
977f7911 112 void (*print_object_filename) PARAMS ((char *));
252b5132
RH
113
114 /* Print the name of an archive file given on the command line. */
977f7911 115 void (*print_archive_filename) PARAMS ((char *));
252b5132
RH
116
117 /* Print the name of an archive member file. */
977f7911 118 void (*print_archive_member) PARAMS ((char *, const char *));
252b5132
RH
119
120 /* Print the name of the file (and archive, if there is one)
121 containing a symbol. */
977f7911 122 void (*print_symbol_filename) PARAMS ((bfd *, bfd *));
252b5132
RH
123
124 /* Print a line of information about a symbol. */
977f7911 125 void (*print_symbol_info) PARAMS ((struct extended_symbol_info *, bfd *));
252b5132 126 };
977f7911 127
252b5132
RH
128static struct output_fns formats[] =
129{
130 {print_object_filename_bsd,
131 print_archive_filename_bsd,
132 print_archive_member_bsd,
133 print_symbol_filename_bsd,
134 print_symbol_info_bsd},
135 {print_object_filename_sysv,
136 print_archive_filename_sysv,
137 print_archive_member_sysv,
138 print_symbol_filename_sysv,
139 print_symbol_info_sysv},
140 {print_object_filename_posix,
141 print_archive_filename_posix,
142 print_archive_member_posix,
143 print_symbol_filename_posix,
144 print_symbol_info_posix}
145};
146
147/* Indices in `formats'. */
148#define FORMAT_BSD 0
149#define FORMAT_SYSV 1
150#define FORMAT_POSIX 2
151#define FORMAT_DEFAULT FORMAT_BSD
152
153/* The output format to use. */
154static struct output_fns *format = &formats[FORMAT_DEFAULT];
155
252b5132
RH
156/* Command options. */
157
158static int do_demangle = 0; /* Pretty print C++ symbol names. */
977f7911
NC
159static int external_only = 0; /* Print external symbols only. */
160static int defined_only = 0; /* Print defined symbols only. */
161static int no_sort = 0; /* Don't sort; print syms in order found. */
162static int print_debug_syms = 0;/* Print debugger-only symbols too. */
163static int print_armap = 0; /* Describe __.SYMDEF data in archive files. */
72797995 164static int print_size = 0; /* Print size of defined symbols. */
977f7911
NC
165static int reverse_sort = 0; /* Sort in downward(alpha or numeric) order. */
166static int sort_numerically = 0;/* Sort in numeric rather than alpha order. */
167static int sort_by_size = 0; /* Sort by size of symbol. */
168static int undefined_only = 0; /* Print undefined symbols only. */
169static int dynamic = 0; /* Print dynamic symbols. */
170static int show_version = 0; /* Show the version number. */
171static int show_stats = 0; /* Show statistics. */
172static int line_numbers = 0; /* Print line numbers for symbols. */
252b5132
RH
173
174/* When to print the names of files. Not mutually exclusive in SYSV format. */
175static int filename_per_file = 0; /* Once per file, on its own line. */
176static int filename_per_symbol = 0; /* Once per symbol, at start of line. */
177
178/* Print formats for printing a symbol value. */
179#ifndef BFD64
180static char value_format[] = "%08lx";
181#else
182#if BFD_HOST_64BIT_LONG
183static char value_format[] = "%016lx";
184#else
185/* We don't use value_format for this case. */
186#endif
187#endif
62a5a82d
L
188#ifdef BFD64
189static int print_width = 16;
190#else
191static int print_width = 8;
192#endif
252b5132
RH
193static int print_radix = 16;
194/* Print formats for printing stab info. */
195static char other_format[] = "%02x";
196static char desc_format[] = "%04x";
197
198static char *target = NULL;
199
200/* Used to cache the line numbers for a BFD. */
201static bfd *lineno_cache_bfd;
202static bfd *lineno_cache_rel_bfd;
203
c20f4f8c
AM
204#define OPTION_TARGET 200
205
252b5132
RH
206static struct option long_options[] =
207{
208 {"debug-syms", no_argument, &print_debug_syms, 1},
28c309a2 209 {"demangle", optional_argument, 0, 'C'},
252b5132
RH
210 {"dynamic", no_argument, &dynamic, 1},
211 {"extern-only", no_argument, &external_only, 1},
212 {"format", required_argument, 0, 'f'},
213 {"help", no_argument, 0, 'h'},
214 {"line-numbers", no_argument, 0, 'l'},
215 {"no-cplus", no_argument, &do_demangle, 0}, /* Linux compatibility. */
216 {"no-demangle", no_argument, &do_demangle, 0},
217 {"no-sort", no_argument, &no_sort, 1},
218 {"numeric-sort", no_argument, &sort_numerically, 1},
219 {"portability", no_argument, 0, 'P'},
220 {"print-armap", no_argument, &print_armap, 1},
221 {"print-file-name", no_argument, 0, 'o'},
72797995 222 {"print-size", no_argument, 0, 'S'},
252b5132
RH
223 {"radix", required_argument, 0, 't'},
224 {"reverse-sort", no_argument, &reverse_sort, 1},
225 {"size-sort", no_argument, &sort_by_size, 1},
226 {"stats", no_argument, &show_stats, 1},
c20f4f8c 227 {"target", required_argument, 0, OPTION_TARGET},
252b5132
RH
228 {"defined-only", no_argument, &defined_only, 1},
229 {"undefined-only", no_argument, &undefined_only, 1},
230 {"version", no_argument, &show_version, 1},
231 {0, no_argument, 0, 0}
232};
233\f
977f7911 234/* Some error-reporting functions. */
252b5132
RH
235
236static void
237usage (stream, status)
238 FILE *stream;
239 int status;
240{
8b53311e
NC
241 fprintf (stream, _("Usage: %s [option(s)] [file(s)]\n"), program_name);
242 fprintf (stream, _(" List symbols in [file(s)] (a.out by default).\n"));
243 fprintf (stream, _(" The options are:\n\
b56f55ce
NC
244 -a, --debug-syms Display debugger-only symbols\n\
245 -A, --print-file-name Print name of the input file before every symbol\n\
246 -B Same as --format=bsd\n\
28c309a2
NC
247 -C, --demangle[=STYLE] Decode low-level symbol names into user-level names\n\
248 The STYLE, if specified, can be `auto' (the default),\n\
249 `gnu', 'lucid', 'arm', 'hp', 'edg' or 'gnu-new-abi'\n\
b56f55ce
NC
250 --no-demangle Do not demangle low-level symbol names\n\
251 -D, --dynamic Display dynamic symbols instead of normal symbols\n\
252 --defined-only Display only defined symbols\n\
253 -e (ignored)\n\
254 -f, --format=FORMAT Use the output format FORMAT. FORMAT can be `bsd',\n\
255 `sysv' or `posix'. The default is `bsd'\n\
256 -g, --extern-only Display only external symbols\n\
b56f55ce
NC
257 -l, --line-numbers Use debugging information to find a filename and\n\
258 line number for each symbol\n\
259 -n, --numeric-sort Sort symbols numerically by address\n\
260 -o Same as -A\n\
261 -p, --no-sort Do not sort the symbols\n\
262 -P, --portability Same as --format=posix\n\
263 -r, --reverse-sort Reverse the sense of the sort\n\
72797995 264 -S, --print-size Print size of defined symbols\n\
b56f55ce
NC
265 -s, --print-armap Include index for symbols from archive members\n\
266 --size-sort Sort symbols by size\n\
267 -t, --radix=RADIX Use RADIX for printing symbol values\n\
268 --target=BFDNAME Specify the target object format as BFDNAME\n\
269 -u, --undefined-only Display only undefined symbols\n\
6e800839 270 -X 32_64 (ignored)\n\
8b53311e
NC
271 -h, --help Display this information\n\
272 -V, --version Display this program's version number\n\
b56f55ce 273\n"));
252b5132
RH
274 list_supported_targets (program_name, stream);
275 if (status == 0)
b56f55ce 276 fprintf (stream, _("Report bugs to %s.\n"), REPORT_BUGS_TO);
252b5132
RH
277 exit (status);
278}
279
280/* Set the radix for the symbol value and size according to RADIX. */
281
282static void
283set_print_radix (radix)
284 char *radix;
285{
286 switch (*radix)
287 {
288 case 'x':
289 break;
290 case 'd':
291 case 'o':
292 if (*radix == 'd')
293 print_radix = 10;
294 else
295 print_radix = 8;
296#ifndef BFD64
297 value_format[4] = *radix;
298#else
299#if BFD_HOST_64BIT_LONG
300 value_format[5] = *radix;
301#else
302 /* This case requires special handling for octal and decimal
303 printing. */
304#endif
305#endif
306 other_format[3] = desc_format[3] = *radix;
307 break;
308 default:
37cc8ec1 309 fatal (_("%s: invalid radix"), radix);
252b5132
RH
310 }
311}
312
313static void
314set_output_format (f)
315 char *f;
316{
317 int i;
318
319 switch (*f)
320 {
321 case 'b':
322 case 'B':
323 i = FORMAT_BSD;
324 break;
325 case 'p':
326 case 'P':
327 i = FORMAT_POSIX;
328 break;
329 case 's':
330 case 'S':
331 i = FORMAT_SYSV;
332 break;
333 default:
37cc8ec1 334 fatal (_("%s: invalid output format"), f);
252b5132
RH
335 }
336 format = &formats[i];
337}
338\f
65de42c0
TS
339int main PARAMS ((int, char **));
340
252b5132
RH
341int
342main (argc, argv)
343 int argc;
344 char **argv;
345{
346 int c;
347 int retval;
348
349#if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
350 setlocale (LC_MESSAGES, "");
3882b010
L
351#endif
352#if defined (HAVE_SETLOCALE)
353 setlocale (LC_CTYPE, "");
252b5132
RH
354#endif
355 bindtextdomain (PACKAGE, LOCALEDIR);
356 textdomain (PACKAGE);
357
358 program_name = *argv;
359 xmalloc_set_program_name (program_name);
360
361 START_PROGRESS (program_name, 0);
362
363 bfd_init ();
364 set_default_bfd_target ();
365
72797995 366 while ((c = getopt_long (argc, argv, "aABCDef:gHhlnopPrSst:uvVvX:",
28c309a2 367 long_options, (int *) 0)) != EOF)
252b5132
RH
368 {
369 switch (c)
370 {
371 case 'a':
372 print_debug_syms = 1;
373 break;
374 case 'A':
375 case 'o':
376 filename_per_symbol = 1;
377 break;
378 case 'B': /* For MIPS compatibility. */
379 set_output_format ("bsd");
380 break;
381 case 'C':
382 do_demangle = 1;
28c309a2
NC
383 if (optarg != NULL)
384 {
385 enum demangling_styles style;
0af11b59 386
28c309a2 387 style = cplus_demangle_name_to_style (optarg);
0af11b59 388 if (style == unknown_demangling)
28c309a2
NC
389 fatal (_("unknown demangling style `%s'"),
390 optarg);
0af11b59 391
28c309a2 392 cplus_demangle_set_style (style);
0af11b59 393 }
252b5132
RH
394 break;
395 case 'D':
396 dynamic = 1;
397 break;
398 case 'e':
399 /* Ignored for HP/UX compatibility. */
400 break;
401 case 'f':
402 set_output_format (optarg);
403 break;
404 case 'g':
405 external_only = 1;
406 break;
8b53311e 407 case 'H':
252b5132
RH
408 case 'h':
409 usage (stdout, 0);
410 case 'l':
411 line_numbers = 1;
412 break;
413 case 'n':
414 case 'v':
415 sort_numerically = 1;
416 break;
417 case 'p':
418 no_sort = 1;
419 break;
420 case 'P':
421 set_output_format ("posix");
422 break;
423 case 'r':
424 reverse_sort = 1;
425 break;
426 case 's':
427 print_armap = 1;
428 break;
72797995
L
429 case 'S':
430 print_size = 1;
431 break;
252b5132
RH
432 case 't':
433 set_print_radix (optarg);
434 break;
435 case 'u':
436 undefined_only = 1;
437 break;
438 case 'V':
439 show_version = 1;
440 break;
6e800839
GK
441 case 'X':
442 /* Ignored for (partial) AIX compatibility. On AIX, the
443 argument has values 32, 64, or 32_64, and specfies that
444 only 32-bit, only 64-bit, or both kinds of objects should
445 be examined. The default is 32. So plain AIX nm on a
446 library archive with both kinds of objects will ignore
447 the 64-bit ones. For GNU nm, the default is and always
448 has been -X 32_64, and other options are not supported. */
449 if (strcmp (optarg, "32_64") != 0)
450 fatal (_("Only -X 32_64 is supported"));
451 break;
252b5132 452
c20f4f8c 453 case OPTION_TARGET: /* --target */
252b5132
RH
454 target = optarg;
455 break;
456
457 case 0: /* A long option that just sets a flag. */
458 break;
459
460 default:
461 usage (stderr, 1);
462 }
463 }
464
465 if (show_version)
466 print_version ("nm");
467
468 /* OK, all options now parsed. If no filename specified, do a.out. */
469 if (optind == argc)
470 return !display_file ("a.out");
471
472 retval = 0;
473
474 if (argc - optind > 1)
475 filename_per_file = 1;
476
477 /* We were given several filenames to do. */
478 while (optind < argc)
479 {
480 PROGRESS (1);
481 if (!display_file (argv[optind++]))
482 retval++;
483 }
484
485 END_PROGRESS (program_name);
486
487#ifdef HAVE_SBRK
488 if (show_stats)
489 {
490 char *lim = (char *) sbrk (0);
491
37cc8ec1 492 non_fatal (_("data size %ld"), (long) (lim - (char *) &environ));
252b5132
RH
493 }
494#endif
495
496 exit (retval);
497 return retval;
498}
499\f
500static void
501display_archive (file)
502 bfd *file;
503{
504 bfd *arfile = NULL;
505 bfd *last_arfile = NULL;
506 char **matching;
507
508 (*format->print_archive_filename) (bfd_get_filename (file));
509
510 if (print_armap)
511 print_symdef_entry (file);
512
513 for (;;)
514 {
515 PROGRESS (1);
516
517 arfile = bfd_openr_next_archived_file (file, arfile);
518
519 if (arfile == NULL)
520 {
521 if (bfd_get_error () != bfd_error_no_more_archived_files)
522 bfd_fatal (bfd_get_filename (file));
523 break;
524 }
525
526 if (bfd_check_format_matches (arfile, bfd_object, &matching))
527 {
528 (*format->print_archive_member) (bfd_get_filename (file),
529 bfd_get_filename (arfile));
530 display_rel_file (arfile, file);
531 }
532 else
533 {
534 bfd_nonfatal (bfd_get_filename (arfile));
535 if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
536 {
537 list_matching_formats (matching);
538 free (matching);
539 }
540 }
541
542 if (last_arfile != NULL)
543 {
544 bfd_close (last_arfile);
545 lineno_cache_bfd = NULL;
546 lineno_cache_rel_bfd = NULL;
547 }
548 last_arfile = arfile;
549 }
550
551 if (last_arfile != NULL)
552 {
553 bfd_close (last_arfile);
554 lineno_cache_bfd = NULL;
555 lineno_cache_rel_bfd = NULL;
556 }
557}
558
559static boolean
560display_file (filename)
561 char *filename;
562{
563 boolean retval = true;
564 bfd *file;
565 char **matching;
566
567 file = bfd_openr (filename, target);
568 if (file == NULL)
569 {
570 bfd_nonfatal (filename);
571 return false;
572 }
573
574 if (bfd_check_format (file, bfd_archive))
575 {
576 display_archive (file);
577 }
578 else if (bfd_check_format_matches (file, bfd_object, &matching))
579 {
580 (*format->print_object_filename) (filename);
581 display_rel_file (file, NULL);
582 }
583 else
584 {
585 bfd_nonfatal (filename);
586 if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
587 {
588 list_matching_formats (matching);
589 free (matching);
590 }
591 retval = false;
592 }
593
594 if (bfd_close (file) == false)
595 bfd_fatal (filename);
596
597 lineno_cache_bfd = NULL;
598 lineno_cache_rel_bfd = NULL;
599
600 return retval;
601}
602\f
603/* These globals are used to pass information into the sorting
604 routines. */
605static bfd *sort_bfd;
606static boolean sort_dynamic;
607static asymbol *sort_x;
608static asymbol *sort_y;
609
610/* Symbol-sorting predicates */
611#define valueof(x) ((x)->section->vma + (x)->value)
612
613/* Numeric sorts. Undefined symbols are always considered "less than"
614 defined symbols with zero values. Common symbols are not treated
615 specially -- i.e., their sizes are used as their "values". */
616
617static int
618numeric_forward (P_x, P_y)
619 const PTR P_x;
620 const PTR P_y;
621{
622 asymbol *x, *y;
623 asection *xs, *ys;
624
625 x = bfd_minisymbol_to_symbol (sort_bfd, sort_dynamic, P_x, sort_x);
626 y = bfd_minisymbol_to_symbol (sort_bfd, sort_dynamic, P_y, sort_y);
627 if (x == NULL || y == NULL)
628 bfd_fatal (bfd_get_filename (sort_bfd));
629
630 xs = bfd_get_section (x);
631 ys = bfd_get_section (y);
632
633 if (bfd_is_und_section (xs))
634 {
635 if (! bfd_is_und_section (ys))
636 return -1;
637 }
638 else if (bfd_is_und_section (ys))
639 return 1;
640 else if (valueof (x) != valueof (y))
641 return valueof (x) < valueof (y) ? -1 : 1;
642
643 return non_numeric_forward (P_x, P_y);
644}
645
646static int
647numeric_reverse (x, y)
648 const PTR x;
649 const PTR y;
650{
651 return - numeric_forward (x, y);
652}
653
654static int
655non_numeric_forward (P_x, P_y)
656 const PTR P_x;
657 const PTR P_y;
658{
659 asymbol *x, *y;
660 const char *xn, *yn;
661
662 x = bfd_minisymbol_to_symbol (sort_bfd, sort_dynamic, P_x, sort_x);
663 y = bfd_minisymbol_to_symbol (sort_bfd, sort_dynamic, P_y, sort_y);
664 if (x == NULL || y == NULL)
665 bfd_fatal (bfd_get_filename (sort_bfd));
666
667 xn = bfd_asymbol_name (x);
668 yn = bfd_asymbol_name (y);
669
670 return ((xn == NULL) ? ((yn == NULL) ? 0 : -1) :
671 ((yn == NULL) ? 1 : strcmp (xn, yn)));
672}
673
674static int
675non_numeric_reverse (x, y)
676 const PTR x;
677 const PTR y;
678{
679 return - non_numeric_forward (x, y);
680}
681
682static int (*(sorters[2][2])) PARAMS ((const PTR, const PTR)) =
683{
684 { non_numeric_forward, non_numeric_reverse },
685 { numeric_forward, numeric_reverse }
686};
687
688/* This sort routine is used by sort_symbols_by_size. It is similar
689 to numeric_forward, but when symbols have the same value it sorts
690 by section VMA. This simplifies the sort_symbols_by_size code
691 which handles symbols at the end of sections. Also, this routine
692 tries to sort file names before other symbols with the same value.
693 That will make the file name have a zero size, which will make
694 sort_symbols_by_size choose the non file name symbol, leading to
695 more meaningful output. For similar reasons, this code sorts
696 gnu_compiled_* and gcc2_compiled before other symbols with the same
697 value. */
698
699static int
700size_forward1 (P_x, P_y)
701 const PTR P_x;
702 const PTR P_y;
703{
704 asymbol *x, *y;
705 asection *xs, *ys;
706 const char *xn, *yn;
707 size_t xnl, ynl;
708 int xf, yf;
709
710 x = bfd_minisymbol_to_symbol (sort_bfd, sort_dynamic, P_x, sort_x);
711 y = bfd_minisymbol_to_symbol (sort_bfd, sort_dynamic, P_y, sort_y);
712 if (x == NULL || y == NULL)
713 bfd_fatal (bfd_get_filename (sort_bfd));
714
715 xs = bfd_get_section (x);
716 ys = bfd_get_section (y);
717
718 if (bfd_is_und_section (xs))
719 abort ();
720 if (bfd_is_und_section (ys))
721 abort ();
722
723 if (valueof (x) != valueof (y))
724 return valueof (x) < valueof (y) ? -1 : 1;
725
726 if (xs->vma != ys->vma)
727 return xs->vma < ys->vma ? -1 : 1;
728
729 xn = bfd_asymbol_name (x);
730 yn = bfd_asymbol_name (y);
731 xnl = strlen (xn);
732 ynl = strlen (yn);
733
734 /* The symbols gnu_compiled and gcc2_compiled convey even less
735 information than the file name, so sort them out first. */
736
737 xf = (strstr (xn, "gnu_compiled") != NULL
738 || strstr (xn, "gcc2_compiled") != NULL);
739 yf = (strstr (yn, "gnu_compiled") != NULL
740 || strstr (yn, "gcc2_compiled") != NULL);
741
742 if (xf && ! yf)
743 return -1;
744 if (! xf && yf)
745 return 1;
746
747 /* We use a heuristic for the file name. It may not work on non
748 Unix systems, but it doesn't really matter; the only difference
749 is precisely which symbol names get printed. */
750
751#define file_symbol(s, sn, snl) \
752 (((s)->flags & BSF_FILE) != 0 \
753 || ((sn)[(snl) - 2] == '.' \
754 && ((sn)[(snl) - 1] == 'o' \
755 || (sn)[(snl) - 1] == 'a')))
756
757 xf = file_symbol (x, xn, xnl);
758 yf = file_symbol (y, yn, ynl);
759
760 if (xf && ! yf)
761 return -1;
762 if (! xf && yf)
763 return 1;
764
765 return non_numeric_forward (P_x, P_y);
766}
767
768/* This sort routine is used by sort_symbols_by_size. It is sorting
769 an array of size_sym structures into size order. */
770
771static int
772size_forward2 (P_x, P_y)
773 const PTR P_x;
774 const PTR P_y;
775{
776 const struct size_sym *x = (const struct size_sym *) P_x;
777 const struct size_sym *y = (const struct size_sym *) P_y;
778
779 if (x->size < y->size)
780 return reverse_sort ? 1 : -1;
781 else if (x->size > y->size)
782 return reverse_sort ? -1 : 1;
783 else
784 return sorters[0][reverse_sort] (x->minisym, y->minisym);
785}
786
6ab6b380
NC
787/* Sort the symbols by size. ELF provides a size but for other formats
788 we have to make a guess by assuming that the difference between the
789 address of a symbol and the address of the next higher symbol is the
790 size. */
252b5132
RH
791
792static long
793sort_symbols_by_size (abfd, dynamic, minisyms, symcount, size, symsizesp)
794 bfd *abfd;
795 boolean dynamic;
796 PTR minisyms;
797 long symcount;
798 unsigned int size;
799 struct size_sym **symsizesp;
800{
801 struct size_sym *symsizes;
802 bfd_byte *from, *fromend;
803 asymbol *sym = NULL;
804 asymbol *store_sym, *store_next;
805
806 qsort (minisyms, symcount, size, size_forward1);
807
808 /* We are going to return a special set of symbols and sizes to
809 print. */
810 symsizes = (struct size_sym *) xmalloc (symcount * sizeof (struct size_sym));
811 *symsizesp = symsizes;
812
813 /* Note that filter_symbols has already removed all absolute and
814 undefined symbols. Here we remove all symbols whose size winds
815 up as zero. */
252b5132
RH
816 from = (bfd_byte *) minisyms;
817 fromend = from + symcount * size;
818
819 store_sym = sort_x;
820 store_next = sort_y;
821
822 if (from < fromend)
823 {
824 sym = bfd_minisymbol_to_symbol (abfd, dynamic, (const PTR) from,
825 store_sym);
826 if (sym == NULL)
827 bfd_fatal (bfd_get_filename (abfd));
828 }
829
830 for (; from < fromend; from += size)
831 {
832 asymbol *next;
833 asection *sec;
834 bfd_vma sz;
835 asymbol *temp;
836
837 if (from + size < fromend)
838 {
839 next = bfd_minisymbol_to_symbol (abfd,
840 dynamic,
841 (const PTR) (from + size),
842 store_next);
843 if (next == NULL)
844 bfd_fatal (bfd_get_filename (abfd));
845 }
846 else
847 next = NULL;
848
849 sec = bfd_get_section (sym);
850
6ab6b380
NC
851 if (bfd_get_flavour (abfd) == bfd_target_elf_flavour)
852 sz = ((elf_symbol_type *) sym)->internal_elf_sym.st_size;
853 else if (bfd_is_com_section (sec))
252b5132
RH
854 sz = sym->value;
855 else
856 {
857 if (from + size < fromend
858 && sec == bfd_get_section (next))
859 sz = valueof (next) - valueof (sym);
860 else
861 sz = (bfd_get_section_vma (abfd, sec)
862 + bfd_section_size (abfd, sec)
863 - valueof (sym));
864 }
865
866 if (sz != 0)
867 {
868 symsizes->minisym = (const PTR) from;
869 symsizes->size = sz;
870 ++symsizes;
871 }
872
873 sym = next;
874
875 temp = store_sym;
876 store_sym = store_next;
877 store_next = temp;
878 }
879
880 symcount = symsizes - *symsizesp;
881
882 /* We must now sort again by size. */
883 qsort ((PTR) *symsizesp, symcount, sizeof (struct size_sym), size_forward2);
884
885 return symcount;
886}
887\f
888/* If ARCHIVE_BFD is non-NULL, it is the archive containing ABFD. */
889
890static void
891display_rel_file (abfd, archive_bfd)
892 bfd *abfd;
893 bfd *archive_bfd;
894{
895 long symcount;
896 PTR minisyms;
897 unsigned int size;
898 struct size_sym *symsizes;
62a5a82d 899 char buf[30];
252b5132
RH
900
901 if (! dynamic)
902 {
903 if (!(bfd_get_file_flags (abfd) & HAS_SYMS))
904 {
37cc8ec1 905 non_fatal (_("%s: no symbols"), bfd_get_filename (abfd));
252b5132
RH
906 return;
907 }
908 }
909
910 symcount = bfd_read_minisymbols (abfd, dynamic, &minisyms, &size);
911 if (symcount < 0)
912 bfd_fatal (bfd_get_filename (abfd));
913
914 if (symcount == 0)
915 {
37cc8ec1 916 non_fatal (_("%s: no symbols"), bfd_get_filename (abfd));
252b5132
RH
917 return;
918 }
919
62a5a82d
L
920 bfd_sprintf_vma (abfd, buf, (bfd_vma) -1);
921 print_width = strlen (buf);
922
252b5132
RH
923 /* Discard the symbols we don't want to print.
924 It's OK to do this in place; we'll free the storage anyway
925 (after printing). */
926
927 symcount = filter_symbols (abfd, dynamic, minisyms, symcount, size);
928
929 symsizes = NULL;
930 if (! no_sort)
931 {
932 sort_bfd = abfd;
933 sort_dynamic = dynamic;
934 sort_x = bfd_make_empty_symbol (abfd);
935 sort_y = bfd_make_empty_symbol (abfd);
936 if (sort_x == NULL || sort_y == NULL)
937 bfd_fatal (bfd_get_filename (abfd));
938
939 if (! sort_by_size)
940 qsort (minisyms, symcount, size,
941 sorters[sort_numerically][reverse_sort]);
942 else
943 symcount = sort_symbols_by_size (abfd, dynamic, minisyms, symcount,
944 size, &symsizes);
945 }
946
947 if (! sort_by_size)
948 print_symbols (abfd, dynamic, minisyms, symcount, size, archive_bfd);
949 else
950 print_size_symbols (abfd, dynamic, symsizes, symcount, archive_bfd);
951
952 free (minisyms);
953}
954\f
955/* Choose which symbol entries to print;
956 compact them downward to get rid of the rest.
957 Return the number of symbols to be printed. */
958
959static long
960filter_symbols (abfd, dynamic, minisyms, symcount, size)
961 bfd *abfd;
962 boolean dynamic;
963 PTR minisyms;
964 long symcount;
965 unsigned int size;
966{
967 bfd_byte *from, *fromend, *to;
968 asymbol *store;
969
970 store = bfd_make_empty_symbol (abfd);
971 if (store == NULL)
972 bfd_fatal (bfd_get_filename (abfd));
973
974 from = (bfd_byte *) minisyms;
975 fromend = from + symcount * size;
976 to = (bfd_byte *) minisyms;
977
978 for (; from < fromend; from += size)
979 {
980 int keep = 0;
981 asymbol *sym;
982
983 PROGRESS (1);
0af11b59 984
252b5132
RH
985 sym = bfd_minisymbol_to_symbol (abfd, dynamic, (const PTR) from, store);
986 if (sym == NULL)
987 bfd_fatal (bfd_get_filename (abfd));
988
989 if (undefined_only)
990 keep = bfd_is_und_section (sym->section);
991 else if (external_only)
992 keep = ((sym->flags & BSF_GLOBAL) != 0
993 || (sym->flags & BSF_WEAK) != 0
994 || bfd_is_und_section (sym->section)
995 || bfd_is_com_section (sym->section));
996 else
997 keep = 1;
998
999 if (keep
1000 && ! print_debug_syms
1001 && (sym->flags & BSF_DEBUGGING) != 0)
1002 keep = 0;
1003
1004 if (keep
1005 && sort_by_size
1006 && (bfd_is_abs_section (sym->section)
1007 || bfd_is_und_section (sym->section)))
1008 keep = 0;
1009
1010 if (keep
1011 && defined_only)
1012 {
1013 if (bfd_is_und_section (sym->section))
1014 keep = 0;
1015 }
1016
1017 if (keep)
1018 {
1019 memcpy (to, from, size);
1020 to += size;
1021 }
1022 }
1023
1024 return (to - (bfd_byte *) minisyms) / size;
1025}
1026\f
1027/* Print symbol name NAME, read from ABFD, with printf format FORMAT,
1028 demangling it if requested. */
1029
1030static void
1031print_symname (format, name, abfd)
1032 const char *format;
1033 const char *name;
1034 bfd *abfd;
1035{
1036 if (do_demangle && *name)
1037 {
1038 char *res;
1039
1040 /* In this mode, give a user-level view of the symbol name
1041 even if it's not mangled; strip off any leading
1042 underscore. */
1043 if (bfd_get_symbol_leading_char (abfd) == name[0])
1044 name++;
1045
1046 res = cplus_demangle (name, DMGL_ANSI | DMGL_PARAMS);
1047 if (res)
1048 {
1049 printf (format, res);
1050 free (res);
1051 return;
1052 }
1053 }
1054
1055 printf (format, name);
1056}
1057
1058/* Print the symbols. If ARCHIVE_BFD is non-NULL, it is the archive
1059 containing ABFD. */
1060
1061static void
1062print_symbols (abfd, dynamic, minisyms, symcount, size, archive_bfd)
1063 bfd *abfd;
1064 boolean dynamic;
1065 PTR minisyms;
1066 long symcount;
1067 unsigned int size;
1068 bfd *archive_bfd;
1069{
1070 asymbol *store;
1071 bfd_byte *from, *fromend;
1072
1073 store = bfd_make_empty_symbol (abfd);
1074 if (store == NULL)
1075 bfd_fatal (bfd_get_filename (abfd));
1076
1077 from = (bfd_byte *) minisyms;
1078 fromend = from + symcount * size;
1079 for (; from < fromend; from += size)
1080 {
1081 asymbol *sym;
977f7911 1082 bfd_vma ssize;
252b5132
RH
1083
1084 sym = bfd_minisymbol_to_symbol (abfd, dynamic, from, store);
1085 if (sym == NULL)
1086 bfd_fatal (bfd_get_filename (abfd));
1087
977f7911
NC
1088 if (bfd_get_flavour (abfd) == bfd_target_elf_flavour)
1089 ssize = ((elf_symbol_type *) sym)->internal_elf_sym.st_size;
1090 else
1091 ssize = 0;
1092
1093 print_symbol (abfd, sym, ssize, archive_bfd);
252b5132
RH
1094 }
1095}
1096
1097/* Print the symbols when sorting by size. */
1098
0af11b59 1099static void
252b5132
RH
1100print_size_symbols (abfd, dynamic, symsizes, symcount, archive_bfd)
1101 bfd *abfd;
1102 boolean dynamic;
1103 struct size_sym *symsizes;
1104 long symcount;
1105 bfd *archive_bfd;
1106{
1107 asymbol *store;
1108 struct size_sym *from, *fromend;
1109
1110 store = bfd_make_empty_symbol (abfd);
1111 if (store == NULL)
1112 bfd_fatal (bfd_get_filename (abfd));
1113
1114 from = symsizes;
1115 fromend = from + symcount;
1116 for (; from < fromend; from++)
1117 {
1118 asymbol *sym;
977f7911 1119 bfd_vma ssize;
252b5132
RH
1120
1121 sym = bfd_minisymbol_to_symbol (abfd, dynamic, from->minisym, store);
1122 if (sym == NULL)
1123 bfd_fatal (bfd_get_filename (abfd));
1124
977f7911 1125 /* Set the symbol value so that we actually display the symbol size. */
252b5132
RH
1126 sym->value = from->size - bfd_section_vma (abfd, bfd_get_section (sym));
1127
977f7911
NC
1128 /* For elf we have already computed the correct symbol size. */
1129 if (bfd_get_flavour (abfd) == bfd_target_elf_flavour)
1130 ssize = from->size;
1131 else
1132 ssize = from->size - bfd_section_vma (abfd, bfd_get_section (sym));
1133
1134 print_symbol (abfd, sym, ssize, archive_bfd);
252b5132
RH
1135 }
1136}
1137
1138/* Print a single symbol. */
1139
1140static void
977f7911 1141print_symbol (abfd, sym, ssize, archive_bfd)
252b5132
RH
1142 bfd *abfd;
1143 asymbol *sym;
977f7911 1144 bfd_vma ssize;
252b5132
RH
1145 bfd *archive_bfd;
1146{
1147 PROGRESS (1);
1148
1149 (*format->print_symbol_filename) (archive_bfd, abfd);
1150
1151 if (undefined_only)
1152 {
1153 if (bfd_is_und_section (bfd_get_section (sym)))
1154 print_symname ("%s", bfd_asymbol_name (sym), abfd);
1155 }
1156 else
1157 {
1158 symbol_info syminfo;
977f7911 1159 struct extended_symbol_info info;
252b5132
RH
1160
1161 bfd_get_symbol_info (abfd, sym, &syminfo);
977f7911
NC
1162 info.sinfo = &syminfo;
1163 info.ssize = ssize;
1164 (*format->print_symbol_info) (&info, abfd);
252b5132
RH
1165 }
1166
1167 if (line_numbers)
1168 {
1169 static asymbol **syms;
1170 static long symcount;
1171 const char *filename, *functionname;
1172 unsigned int lineno;
1173
1174 /* We need to get the canonical symbols in order to call
1175 bfd_find_nearest_line. This is inefficient, but, then, you
1176 don't have to use --line-numbers. */
1177 if (abfd != lineno_cache_bfd && syms != NULL)
1178 {
1179 free (syms);
1180 syms = NULL;
1181 }
1182 if (syms == NULL)
1183 {
1184 long symsize;
1185
1186 symsize = bfd_get_symtab_upper_bound (abfd);
1187 if (symsize < 0)
1188 bfd_fatal (bfd_get_filename (abfd));
1189 syms = (asymbol **) xmalloc (symsize);
1190 symcount = bfd_canonicalize_symtab (abfd, syms);
1191 if (symcount < 0)
1192 bfd_fatal (bfd_get_filename (abfd));
1193 lineno_cache_bfd = abfd;
1194 }
1195
1196 if (bfd_is_und_section (bfd_get_section (sym)))
1197 {
1198 static asection **secs;
1199 static arelent ***relocs;
1200 static long *relcount;
1201 static unsigned int seccount;
1202 unsigned int i;
1203 const char *symname;
1204
1205 /* For an undefined symbol, we try to find a reloc for the
1206 symbol, and print the line number of the reloc. */
252b5132
RH
1207 if (abfd != lineno_cache_rel_bfd && relocs != NULL)
1208 {
1209 for (i = 0; i < seccount; i++)
1210 if (relocs[i] != NULL)
1211 free (relocs[i]);
1212 free (secs);
1213 free (relocs);
1214 free (relcount);
1215 secs = NULL;
1216 relocs = NULL;
1217 relcount = NULL;
1218 }
1219
1220 if (relocs == NULL)
1221 {
1222 struct get_relocs_info info;
1223
1224 seccount = bfd_count_sections (abfd);
1225
1226 secs = (asection **) xmalloc (seccount * sizeof *secs);
1227 relocs = (arelent ***) xmalloc (seccount * sizeof *relocs);
1228 relcount = (long *) xmalloc (seccount * sizeof *relcount);
1229
1230 info.secs = secs;
1231 info.relocs = relocs;
1232 info.relcount = relcount;
1233 info.syms = syms;
1234 bfd_map_over_sections (abfd, get_relocs, (PTR) &info);
1235 lineno_cache_rel_bfd = abfd;
1236 }
1237
1238 symname = bfd_asymbol_name (sym);
1239 for (i = 0; i < seccount; i++)
1240 {
1241 long j;
1242
1243 for (j = 0; j < relcount[i]; j++)
1244 {
1245 arelent *r;
1246
1247 r = relocs[i][j];
1248 if (r->sym_ptr_ptr != NULL
1249 && (*r->sym_ptr_ptr)->section == sym->section
1250 && (*r->sym_ptr_ptr)->value == sym->value
1251 && strcmp (symname,
1252 bfd_asymbol_name (*r->sym_ptr_ptr)) == 0
1253 && bfd_find_nearest_line (abfd, secs[i], syms,
1254 r->address, &filename,
dd70071f
AM
1255 &functionname, &lineno)
1256 && filename != NULL)
252b5132
RH
1257 {
1258 /* We only print the first one we find. */
1259 printf ("\t%s:%u", filename, lineno);
1260 i = seccount;
1261 break;
1262 }
1263 }
1264 }
1265 }
1266 else if (bfd_get_section (sym)->owner == abfd)
1267 {
1268 if (bfd_find_nearest_line (abfd, bfd_get_section (sym), syms,
1269 sym->value, &filename, &functionname,
1270 &lineno)
1271 && filename != NULL
1272 && lineno != 0)
1273 {
1274 printf ("\t%s:%u", filename, lineno);
1275 }
1276 }
1277 }
1278
1279 putchar ('\n');
1280}
1281\f
1282/* The following 3 groups of functions are called unconditionally,
1283 once at the start of processing each file of the appropriate type.
1284 They should check `filename_per_file' and `filename_per_symbol',
1285 as appropriate for their output format, to determine whether to
1286 print anything. */
1287\f
1288/* Print the name of an object file given on the command line. */
1289
1290static void
1291print_object_filename_bsd (filename)
1292 char *filename;
1293{
1294 if (filename_per_file && !filename_per_symbol)
1295 printf ("\n%s:\n", filename);
1296}
1297
1298static void
1299print_object_filename_sysv (filename)
1300 char *filename;
1301{
1302 if (undefined_only)
1303 printf (_("\n\nUndefined symbols from %s:\n\n"), filename);
1304 else
1305 printf (_("\n\nSymbols from %s:\n\n"), filename);
1306 printf (_("\
1307Name Value Class Type Size Line Section\n\n"));
1308}
1309
1310static void
1311print_object_filename_posix (filename)
1312 char *filename;
1313{
1314 if (filename_per_file && !filename_per_symbol)
1315 printf ("%s:\n", filename);
1316}
1317\f
1318/* Print the name of an archive file given on the command line. */
1319
1320static void
1321print_archive_filename_bsd (filename)
1322 char *filename;
1323{
1324 if (filename_per_file)
1325 printf ("\n%s:\n", filename);
1326}
1327
1328static void
1329print_archive_filename_sysv (filename)
b4c96d0d 1330 char *filename ATTRIBUTE_UNUSED;
252b5132
RH
1331{
1332}
1333
1334static void
1335print_archive_filename_posix (filename)
b4c96d0d 1336 char *filename ATTRIBUTE_UNUSED;
252b5132
RH
1337{
1338}
1339\f
1340/* Print the name of an archive member file. */
1341
1342static void
1343print_archive_member_bsd (archive, filename)
b4c96d0d 1344 char *archive ATTRIBUTE_UNUSED;
b1f88ebe 1345 const char *filename;
252b5132
RH
1346{
1347 if (!filename_per_symbol)
1348 printf ("\n%s:\n", filename);
1349}
1350
1351static void
1352print_archive_member_sysv (archive, filename)
1353 char *archive;
b1f88ebe 1354 const char *filename;
252b5132
RH
1355{
1356 if (undefined_only)
1357 printf (_("\n\nUndefined symbols from %s[%s]:\n\n"), archive, filename);
1358 else
1359 printf (_("\n\nSymbols from %s[%s]:\n\n"), archive, filename);
1360 printf (_("\
1361Name Value Class Type Size Line Section\n\n"));
1362}
1363
1364static void
1365print_archive_member_posix (archive, filename)
1366 char *archive;
b1f88ebe 1367 const char *filename;
252b5132
RH
1368{
1369 if (!filename_per_symbol)
1370 printf ("%s[%s]:\n", archive, filename);
1371}
1372\f
1373/* Print the name of the file (and archive, if there is one)
1374 containing a symbol. */
1375
1376static void
1377print_symbol_filename_bsd (archive_bfd, abfd)
1378 bfd *archive_bfd, *abfd;
1379{
1380 if (filename_per_symbol)
1381 {
1382 if (archive_bfd)
1383 printf ("%s:", bfd_get_filename (archive_bfd));
1384 printf ("%s:", bfd_get_filename (abfd));
1385 }
1386}
1387
1388static void
1389print_symbol_filename_sysv (archive_bfd, abfd)
1390 bfd *archive_bfd, *abfd;
1391{
1392 if (filename_per_symbol)
1393 {
1394 if (archive_bfd)
1395 printf ("%s:", bfd_get_filename (archive_bfd));
1396 printf ("%s:", bfd_get_filename (abfd));
1397 }
1398}
1399
1400static void
1401print_symbol_filename_posix (archive_bfd, abfd)
1402 bfd *archive_bfd, *abfd;
1403{
1404 if (filename_per_symbol)
1405 {
1406 if (archive_bfd)
1407 printf ("%s[%s]: ", bfd_get_filename (archive_bfd),
1408 bfd_get_filename (abfd));
1409 else
1410 printf ("%s: ", bfd_get_filename (abfd));
1411 }
1412}
1413\f
1414/* Print a symbol value. */
1415
1416static void
d8180c76 1417print_value (abfd, val)
3deb89d3 1418 bfd *abfd ATTRIBUTE_UNUSED;
252b5132
RH
1419 bfd_vma val;
1420{
1421#if ! defined (BFD64) || BFD_HOST_64BIT_LONG
1422 printf (value_format, val);
1423#else
1424 /* We have a 64 bit value to print, but the host is only 32 bit. */
1425 if (print_radix == 16)
d8180c76 1426 bfd_fprintf_vma (abfd, stdout, val);
252b5132
RH
1427 else
1428 {
1429 char buf[30];
1430 char *s;
1431
1432 s = buf + sizeof buf;
1433 *--s = '\0';
1434 while (val > 0)
1435 {
1436 *--s = (val % print_radix) + '0';
1437 val /= print_radix;
1438 }
1439 while ((buf + sizeof buf - 1) - s < 16)
1440 *--s = '0';
1441 printf ("%s", s);
1442 }
1443#endif
1444}
1445
1446/* Print a line of information about a symbol. */
1447
1448static void
1449print_symbol_info_bsd (info, abfd)
977f7911 1450 struct extended_symbol_info *info;
252b5132
RH
1451 bfd *abfd;
1452{
977f7911 1453 if (bfd_is_undefined_symclass (SYM_TYPE (info)))
252b5132 1454 {
62a5a82d
L
1455 if (print_width == 16)
1456 printf (" ");
21211521 1457 printf (" ");
252b5132
RH
1458 }
1459 else
977f7911
NC
1460 {
1461 print_value (abfd, SYM_VALUE (info));
1462
72797995 1463 if (print_size && SYM_SIZE (info))
977f7911
NC
1464 {
1465 printf(" ");
1466 print_value (abfd, SYM_SIZE (info));
1467 }
1468 }
1469
1470 printf (" %c", SYM_TYPE (info));
1471
1472 if (SYM_TYPE (info) == '-')
252b5132
RH
1473 {
1474 /* A stab. */
1475 printf (" ");
977f7911 1476 printf (other_format, SYM_STAB_OTHER (info));
252b5132 1477 printf (" ");
977f7911
NC
1478 printf (desc_format, SYM_STAB_DESC (info));
1479 printf (" %5s", SYM_STAB_NAME (info));
252b5132 1480 }
977f7911 1481 print_symname (" %s", SYM_NAME (info), abfd);
252b5132
RH
1482}
1483
1484static void
1485print_symbol_info_sysv (info, abfd)
977f7911 1486 struct extended_symbol_info *info;
252b5132
RH
1487 bfd *abfd;
1488{
977f7911
NC
1489 print_symname ("%-20s|", SYM_NAME (info), abfd);
1490
1491 if (bfd_is_undefined_symclass (SYM_TYPE (info)))
1492 printf (" ");
252b5132 1493 else
977f7911
NC
1494 print_value (abfd, SYM_VALUE (info));
1495
1496 printf ("| %c |", SYM_TYPE (info));
1497
1498 if (SYM_TYPE (info) == '-')
252b5132
RH
1499 {
1500 /* A stab. */
977f7911
NC
1501 printf ("%18s| ", SYM_STAB_NAME (info)); /* (C) Type */
1502 printf (desc_format, SYM_STAB_DESC (info)); /* Size */
1503 printf ("| |"); /* Line, Section */
252b5132
RH
1504 }
1505 else
977f7911
NC
1506 {
1507 /* Type, Size, Line, Section */
1508 printf (" |");
1509
1510 if (SYM_SIZE (info))
1511 print_value (abfd, SYM_SIZE (info));
1512 else
1513 printf(" ");
1514
1515 printf("| |");
1516 }
252b5132
RH
1517}
1518
1519static void
1520print_symbol_info_posix (info, abfd)
977f7911 1521 struct extended_symbol_info *info;
252b5132
RH
1522 bfd *abfd;
1523{
977f7911
NC
1524 print_symname ("%s ", SYM_NAME (info), abfd);
1525 printf ("%c ", SYM_TYPE (info));
1526
1527 if (bfd_is_undefined_symclass (SYM_TYPE (info)))
252b5132
RH
1528 printf (" ");
1529 else
977f7911
NC
1530 {
1531 print_value (abfd, SYM_VALUE (info));
1532 printf (" ");
1533 if (SYM_SIZE (info))
1534 print_value (abfd, SYM_SIZE (info));
1535 }
252b5132
RH
1536}
1537\f
1538static void
1539print_symdef_entry (abfd)
1540 bfd *abfd;
1541{
1542 symindex idx = BFD_NO_MORE_SYMBOLS;
1543 carsym *thesym;
1544 boolean everprinted = false;
1545
1546 for (idx = bfd_get_next_mapent (abfd, idx, &thesym);
1547 idx != BFD_NO_MORE_SYMBOLS;
1548 idx = bfd_get_next_mapent (abfd, idx, &thesym))
1549 {
1550 bfd *elt;
1551 if (!everprinted)
1552 {
1553 printf (_("\nArchive index:\n"));
1554 everprinted = true;
1555 }
1556 elt = bfd_get_elt_at_index (abfd, idx);
1557 if (elt == NULL)
1558 bfd_fatal ("bfd_get_elt_at_index");
1559 if (thesym->name != (char *) NULL)
1560 {
1561 print_symname ("%s", thesym->name, abfd);
1562 printf (" in %s\n", bfd_get_filename (elt));
1563 }
1564 }
1565}
1566\f
1567/* This function is used to get the relocs for a particular section.
1568 It is called via bfd_map_over_sections. */
1569
1570static void
1571get_relocs (abfd, sec, dataarg)
1572 bfd *abfd;
1573 asection *sec;
1574 PTR dataarg;
1575{
1576 struct get_relocs_info *data = (struct get_relocs_info *) dataarg;
1577
1578 *data->secs = sec;
1579
1580 if ((sec->flags & SEC_RELOC) == 0)
1581 {
1582 *data->relocs = NULL;
1583 *data->relcount = 0;
1584 }
1585 else
1586 {
1587 long relsize;
1588
1589 relsize = bfd_get_reloc_upper_bound (abfd, sec);
1590 if (relsize < 0)
1591 bfd_fatal (bfd_get_filename (abfd));
1592
1593 *data->relocs = (arelent **) xmalloc (relsize);
1594 *data->relcount = bfd_canonicalize_reloc (abfd, sec, *data->relocs,
1595 data->syms);
1596 if (*data->relcount < 0)
1597 bfd_fatal (bfd_get_filename (abfd));
1598 }
1599
1600 ++data->secs;
1601 ++data->relocs;
1602 ++data->relcount;
1603}