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