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