[PATCH 40/57][Arm][OBJDUMP] Add support for MVE instructions: vdup, veor, vfma, vfms...
[binutils-gdb.git] / binutils / nm.c
blobfd3f73167e085defd041c04e1a3f487ed93c57f0
1 /* nm.c -- Describe symbol table of a rel file.
2 Copyright (C) 1991-2019 Free Software Foundation, Inc.
4 This file is part of GNU Binutils.
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.
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.
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. */
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"
42 /* When sorting by size, we use this structure to hold the size and a
43 pointer to the minisymbol. */
45 struct size_sym
47 const void *minisym;
48 bfd_vma size;
51 /* When fetching relocs, we use this structure to pass information to
52 get_relocs. */
54 struct get_relocs_info
56 asection **secs;
57 arelent ***relocs;
58 long *relcount;
59 asymbol **syms;
62 struct extended_symbol_info
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. */
70 #define SYM_NAME(sym) (sym->sinfo->name)
71 #define SYM_VALUE(sym) (sym->sinfo->value)
72 #define SYM_TYPE(sym) (sym->sinfo->type)
73 #define SYM_STAB_NAME(sym) (sym->sinfo->stab_name)
74 #define SYM_STAB_DESC(sym) (sym->sinfo->stab_desc)
75 #define SYM_STAB_OTHER(sym) (sym->sinfo->stab_other)
76 #define SYM_SIZE(sym) \
77 (sym->elfinfo ? sym->elfinfo->internal_elf_sym.st_size: sym->ssize)
79 /* The output formatting functions. */
80 static void print_object_filename_bsd (char *);
81 static void print_object_filename_sysv (char *);
82 static void print_object_filename_posix (char *);
83 static void print_archive_filename_bsd (char *);
84 static void print_archive_filename_sysv (char *);
85 static void print_archive_filename_posix (char *);
86 static void print_archive_member_bsd (char *, const char *);
87 static void print_archive_member_sysv (char *, const char *);
88 static void print_archive_member_posix (char *, const char *);
89 static void print_symbol_filename_bsd (bfd *, bfd *);
90 static void print_symbol_filename_sysv (bfd *, bfd *);
91 static void print_symbol_filename_posix (bfd *, bfd *);
92 static void print_value (bfd *, bfd_vma);
93 static void print_symbol_info_bsd (struct extended_symbol_info *, bfd *);
94 static void print_symbol_info_sysv (struct extended_symbol_info *, bfd *);
95 static void print_symbol_info_posix (struct extended_symbol_info *, bfd *);
97 /* Support for different output formats. */
98 struct output_fns
100 /* Print the name of an object file given on the command line. */
101 void (*print_object_filename) (char *);
103 /* Print the name of an archive file given on the command line. */
104 void (*print_archive_filename) (char *);
106 /* Print the name of an archive member file. */
107 void (*print_archive_member) (char *, const char *);
109 /* Print the name of the file (and archive, if there is one)
110 containing a symbol. */
111 void (*print_symbol_filename) (bfd *, bfd *);
113 /* Print a line of information about a symbol. */
114 void (*print_symbol_info) (struct extended_symbol_info *, bfd *);
117 static struct output_fns formats[] =
119 {print_object_filename_bsd,
120 print_archive_filename_bsd,
121 print_archive_member_bsd,
122 print_symbol_filename_bsd,
123 print_symbol_info_bsd},
124 {print_object_filename_sysv,
125 print_archive_filename_sysv,
126 print_archive_member_sysv,
127 print_symbol_filename_sysv,
128 print_symbol_info_sysv},
129 {print_object_filename_posix,
130 print_archive_filename_posix,
131 print_archive_member_posix,
132 print_symbol_filename_posix,
133 print_symbol_info_posix}
136 /* Indices in `formats'. */
137 #define FORMAT_BSD 0
138 #define FORMAT_SYSV 1
139 #define FORMAT_POSIX 2
140 #define FORMAT_DEFAULT FORMAT_BSD
142 /* The output format to use. */
143 static struct output_fns *format = &formats[FORMAT_DEFAULT];
144 static unsigned int print_format = FORMAT_DEFAULT;
146 /* Command options. */
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 static int with_symbol_versions = 0; /* Include symbol version information in the output. */
166 static int demangle_flags = DMGL_ANSI | DMGL_PARAMS;
168 /* When to print the names of files. Not mutually exclusive in SYSV format. */
169 static int filename_per_file = 0; /* Once per file, on its own line. */
170 static int filename_per_symbol = 0; /* Once per symbol, at start of line. */
172 static int print_width = 0;
173 static int print_radix = 16;
174 /* Print formats for printing stab info. */
175 static char other_format[] = "%02x";
176 static char desc_format[] = "%04x";
178 static char *target = NULL;
179 #if BFD_SUPPORTS_PLUGINS
180 static const char *plugin_target = "plugin";
181 #else
182 static const char *plugin_target = NULL;
183 #endif
185 /* Used to cache the line numbers for a BFD. */
186 static bfd *lineno_cache_bfd;
187 static bfd *lineno_cache_rel_bfd;
189 enum long_option_values
191 OPTION_TARGET = 200,
192 OPTION_PLUGIN,
193 OPTION_SIZE_SORT,
194 OPTION_RECURSE_LIMIT,
195 OPTION_NO_RECURSE_LIMIT
198 static struct option long_options[] =
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, &with_symbol_versions, 1},
230 {0, no_argument, 0, 0}
233 /* Some error-reporting functions. */
235 ATTRIBUTE_NORETURN static void
236 usage (FILE *stream, int status)
238 fprintf (stream, _("Usage: %s [option(s)] [file(s)]\n"), program_name);
239 fprintf (stream, _(" List symbols in [file(s)] (a.out by default).\n"));
240 fprintf (stream, _(" The options are:\n\
241 -a, --debug-syms Display debugger-only symbols\n\
242 -A, --print-file-name Print name of the input file before every symbol\n\
243 -B Same as --format=bsd\n\
244 -C, --demangle[=STYLE] Decode low-level symbol names into user-level names\n\
245 The STYLE, if specified, can be `auto' (the default),\n\
246 `gnu', `lucid', `arm', `hp', `edg', `gnu-v3', `java'\n\
247 or `gnat'\n\
248 --no-demangle Do not demangle low-level symbol names\n\
249 --recurse-limit Enable a demangling recursion limit. This is the default.\n\
250 --no-recurse-limit Disable a demangling recursion limit.\n\
251 -D, --dynamic Display dynamic symbols instead of normal symbols\n\
252 --defined-only Display only defined symbols\n\
253 -e (ignored)\n\
254 -f, --format=FORMAT Use the output format FORMAT. FORMAT can be `bsd',\n\
255 `sysv' or `posix'. The default is `bsd'\n\
256 -g, --extern-only Display only external symbols\n\
257 -l, --line-numbers Use debugging information to find a filename and\n\
258 line number for each symbol\n\
259 -n, --numeric-sort Sort symbols numerically by address\n\
260 -o Same as -A\n\
261 -p, --no-sort Do not sort the symbols\n\
262 -P, --portability Same as --format=posix\n\
263 -r, --reverse-sort Reverse the sense of the sort\n"));
264 #if BFD_SUPPORTS_PLUGINS
265 fprintf (stream, _("\
266 --plugin NAME Load the specified plugin\n"));
267 #endif
268 fprintf (stream, _("\
269 -S, --print-size Print size of defined symbols\n\
270 -s, --print-armap Include index for symbols from archive members\n\
271 --size-sort Sort symbols by size\n\
272 --special-syms Include special symbols in the output\n\
273 --synthetic Display synthetic symbols as well\n\
274 -t, --radix=RADIX Use RADIX for printing symbol values\n\
275 --target=BFDNAME Specify the target object format as BFDNAME\n\
276 -u, --undefined-only Display only undefined symbols\n\
277 --with-symbol-versions Display version strings after symbol names\n\
278 -X 32_64 (ignored)\n\
279 @FILE Read options from FILE\n\
280 -h, --help Display this information\n\
281 -V, --version Display this program's version number\n\
282 \n"));
283 list_supported_targets (program_name, stream);
284 if (REPORT_BUGS_TO[0] && status == 0)
285 fprintf (stream, _("Report bugs to %s.\n"), REPORT_BUGS_TO);
286 exit (status);
289 /* Set the radix for the symbol value and size according to RADIX. */
291 static void
292 set_print_radix (char *radix)
294 switch (*radix)
296 case 'x': print_radix = 16; break;
297 case 'd': print_radix = 10; break;
298 case 'o': print_radix = 8; break;
300 default:
301 fatal (_("%s: invalid radix"), radix);
304 other_format[3] = desc_format[3] = *radix;
307 static void
308 set_output_format (char *f)
310 int i;
312 switch (*f)
314 case 'b':
315 case 'B':
316 i = FORMAT_BSD;
317 break;
318 case 'p':
319 case 'P':
320 i = FORMAT_POSIX;
321 break;
322 case 's':
323 case 'S':
324 i = FORMAT_SYSV;
325 break;
326 default:
327 fatal (_("%s: invalid output format"), f);
329 format = &formats[i];
330 print_format = i;
333 static const char *
334 get_elf_symbol_type (unsigned int type)
336 static char *bufp;
337 int n;
339 switch (type)
341 case STT_NOTYPE: return "NOTYPE";
342 case STT_OBJECT: return "OBJECT";
343 case STT_FUNC: return "FUNC";
344 case STT_SECTION: return "SECTION";
345 case STT_FILE: return "FILE";
346 case STT_COMMON: return "COMMON";
347 case STT_TLS: return "TLS";
350 free (bufp);
351 if (type >= STT_LOPROC && type <= STT_HIPROC)
352 n = asprintf (&bufp, _("<processor specific>: %d"), type);
353 else if (type >= STT_LOOS && type <= STT_HIOS)
354 n = asprintf (&bufp, _("<OS specific>: %d"), type);
355 else
356 n = asprintf (&bufp, _("<unknown>: %d"), type);
357 if (n < 0)
358 fatal ("%s", xstrerror (errno));
359 return bufp;
362 static const char *
363 get_coff_symbol_type (const struct internal_syment *sym)
365 static char *bufp;
366 int n;
368 switch (sym->n_sclass)
370 case C_BLOCK: return "Block";
371 case C_FILE: return "File";
372 case C_LINE: return "Line";
375 if (!sym->n_type)
376 return "None";
378 switch (DTYPE(sym->n_type))
380 case DT_FCN: return "Function";
381 case DT_PTR: return "Pointer";
382 case DT_ARY: return "Array";
385 free (bufp);
386 n = asprintf (&bufp, _("<unknown>: %d/%d"), sym->n_sclass, sym->n_type);
387 if (n < 0)
388 fatal ("%s", xstrerror (errno));
389 return bufp;
392 /* Print symbol name NAME, read from ABFD, with printf format FORM,
393 demangling it if requested. */
395 static void
396 print_symname (const char *form, const char *name, bfd *abfd)
398 if (do_demangle && *name)
400 char *res = bfd_demangle (abfd, name, demangle_flags);
402 if (res != NULL)
404 printf (form, res);
405 free (res);
406 return;
410 printf (form, name);
413 static void
414 print_symdef_entry (bfd *abfd)
416 symindex idx = BFD_NO_MORE_SYMBOLS;
417 carsym *thesym;
418 bfd_boolean everprinted = FALSE;
420 for (idx = bfd_get_next_mapent (abfd, idx, &thesym);
421 idx != BFD_NO_MORE_SYMBOLS;
422 idx = bfd_get_next_mapent (abfd, idx, &thesym))
424 bfd *elt;
425 if (!everprinted)
427 printf (_("\nArchive index:\n"));
428 everprinted = TRUE;
430 elt = bfd_get_elt_at_index (abfd, idx);
431 if (elt == NULL)
432 bfd_fatal ("bfd_get_elt_at_index");
433 if (thesym->name != (char *) NULL)
435 print_symname ("%s", thesym->name, abfd);
436 printf (" in %s\n", bfd_get_filename (elt));
441 /* Choose which symbol entries to print;
442 compact them downward to get rid of the rest.
443 Return the number of symbols to be printed. */
445 static long
446 filter_symbols (bfd *abfd, bfd_boolean is_dynamic, void *minisyms,
447 long symcount, unsigned int size)
449 bfd_byte *from, *fromend, *to;
450 asymbol *store;
452 store = bfd_make_empty_symbol (abfd);
453 if (store == NULL)
454 bfd_fatal (bfd_get_filename (abfd));
456 from = (bfd_byte *) minisyms;
457 fromend = from + symcount * size;
458 to = (bfd_byte *) minisyms;
460 for (; from < fromend; from += size)
462 int keep = 0;
463 asymbol *sym;
465 PROGRESS (1);
467 sym = bfd_minisymbol_to_symbol (abfd, is_dynamic, (const void *) from, store);
468 if (sym == NULL)
469 bfd_fatal (bfd_get_filename (abfd));
471 if (sym->name[0] == '_'
472 && sym->name[1] == '_'
473 && strcmp (sym->name + (sym->name[2] == '_'), "__gnu_lto_slim") == 0)
474 non_fatal (_("%s: plugin needed to handle lto object"),
475 bfd_get_filename (abfd));
477 if (undefined_only)
478 keep = bfd_is_und_section (sym->section);
479 else if (external_only)
480 /* PR binutls/12753: Unique symbols are global too. */
481 keep = ((sym->flags & (BSF_GLOBAL
482 | BSF_WEAK
483 | BSF_GNU_UNIQUE)) != 0
484 || bfd_is_und_section (sym->section)
485 || bfd_is_com_section (sym->section));
486 else
487 keep = 1;
489 if (keep
490 && ! print_debug_syms
491 && (sym->flags & BSF_DEBUGGING) != 0)
492 keep = 0;
494 if (keep
495 && sort_by_size
496 && (bfd_is_abs_section (sym->section)
497 || bfd_is_und_section (sym->section)))
498 keep = 0;
500 if (keep
501 && defined_only)
503 if (bfd_is_und_section (sym->section))
504 keep = 0;
507 if (keep
508 && bfd_is_target_special_symbol (abfd, sym)
509 && ! allow_special_symbols)
510 keep = 0;
512 if (keep)
514 if (to != from)
515 memcpy (to, from, size);
516 to += size;
520 return (to - (bfd_byte *) minisyms) / size;
523 /* These globals are used to pass information into the sorting
524 routines. */
525 static bfd *sort_bfd;
526 static bfd_boolean sort_dynamic;
527 static asymbol *sort_x;
528 static asymbol *sort_y;
530 /* Symbol-sorting predicates */
531 #define valueof(x) ((x)->section->vma + (x)->value)
533 /* Numeric sorts. Undefined symbols are always considered "less than"
534 defined symbols with zero values. Common symbols are not treated
535 specially -- i.e., their sizes are used as their "values". */
537 static int
538 non_numeric_forward (const void *P_x, const void *P_y)
540 asymbol *x, *y;
541 const char *xn, *yn;
543 x = bfd_minisymbol_to_symbol (sort_bfd, sort_dynamic, P_x, sort_x);
544 y = bfd_minisymbol_to_symbol (sort_bfd, sort_dynamic, P_y, sort_y);
545 if (x == NULL || y == NULL)
546 bfd_fatal (bfd_get_filename (sort_bfd));
548 xn = bfd_asymbol_name (x);
549 yn = bfd_asymbol_name (y);
551 if (yn == NULL)
552 return xn != NULL;
553 if (xn == NULL)
554 return -1;
556 #ifdef HAVE_STRCOLL
557 /* Solaris 2.5 has a bug in strcoll.
558 strcoll returns invalid values when confronted with empty strings. */
559 if (*yn == '\0')
560 return *xn != '\0';
561 if (*xn == '\0')
562 return -1;
564 return strcoll (xn, yn);
565 #else
566 return strcmp (xn, yn);
567 #endif
570 static int
571 non_numeric_reverse (const void *x, const void *y)
573 return - non_numeric_forward (x, y);
576 static int
577 numeric_forward (const void *P_x, const void *P_y)
579 asymbol *x, *y;
580 asection *xs, *ys;
582 x = bfd_minisymbol_to_symbol (sort_bfd, sort_dynamic, P_x, sort_x);
583 y = bfd_minisymbol_to_symbol (sort_bfd, sort_dynamic, P_y, sort_y);
584 if (x == NULL || y == NULL)
585 bfd_fatal (bfd_get_filename (sort_bfd));
587 xs = bfd_get_section (x);
588 ys = bfd_get_section (y);
590 if (bfd_is_und_section (xs))
592 if (! bfd_is_und_section (ys))
593 return -1;
595 else if (bfd_is_und_section (ys))
596 return 1;
597 else if (valueof (x) != valueof (y))
598 return valueof (x) < valueof (y) ? -1 : 1;
600 return non_numeric_forward (P_x, P_y);
603 static int
604 numeric_reverse (const void *x, const void *y)
606 return - numeric_forward (x, y);
609 static int (*(sorters[2][2])) (const void *, const void *) =
611 { non_numeric_forward, non_numeric_reverse },
612 { numeric_forward, numeric_reverse }
615 /* This sort routine is used by sort_symbols_by_size. It is similar
616 to numeric_forward, but when symbols have the same value it sorts
617 by section VMA. This simplifies the sort_symbols_by_size code
618 which handles symbols at the end of sections. Also, this routine
619 tries to sort file names before other symbols with the same value.
620 That will make the file name have a zero size, which will make
621 sort_symbols_by_size choose the non file name symbol, leading to
622 more meaningful output. For similar reasons, this code sorts
623 gnu_compiled_* and gcc2_compiled before other symbols with the same
624 value. */
626 static int
627 size_forward1 (const void *P_x, const void *P_y)
629 asymbol *x, *y;
630 asection *xs, *ys;
631 const char *xn, *yn;
632 size_t xnl, ynl;
633 int xf, yf;
635 x = bfd_minisymbol_to_symbol (sort_bfd, sort_dynamic, P_x, sort_x);
636 y = bfd_minisymbol_to_symbol (sort_bfd, sort_dynamic, P_y, sort_y);
637 if (x == NULL || y == NULL)
638 bfd_fatal (bfd_get_filename (sort_bfd));
640 xs = bfd_get_section (x);
641 ys = bfd_get_section (y);
643 if (bfd_is_und_section (xs))
644 abort ();
645 if (bfd_is_und_section (ys))
646 abort ();
648 if (valueof (x) != valueof (y))
649 return valueof (x) < valueof (y) ? -1 : 1;
651 if (xs->vma != ys->vma)
652 return xs->vma < ys->vma ? -1 : 1;
654 xn = bfd_asymbol_name (x);
655 yn = bfd_asymbol_name (y);
656 xnl = strlen (xn);
657 ynl = strlen (yn);
659 /* The symbols gnu_compiled and gcc2_compiled convey even less
660 information than the file name, so sort them out first. */
662 xf = (strstr (xn, "gnu_compiled") != NULL
663 || strstr (xn, "gcc2_compiled") != NULL);
664 yf = (strstr (yn, "gnu_compiled") != NULL
665 || strstr (yn, "gcc2_compiled") != NULL);
667 if (xf && ! yf)
668 return -1;
669 if (! xf && yf)
670 return 1;
672 /* We use a heuristic for the file name. It may not work on non
673 Unix systems, but it doesn't really matter; the only difference
674 is precisely which symbol names get printed. */
676 #define file_symbol(s, sn, snl) \
677 (((s)->flags & BSF_FILE) != 0 \
678 || ((snl) > 2 \
679 && (sn)[(snl) - 2] == '.' \
680 && ((sn)[(snl) - 1] == 'o' \
681 || (sn)[(snl) - 1] == 'a')))
683 xf = file_symbol (x, xn, xnl);
684 yf = file_symbol (y, yn, ynl);
686 if (xf && ! yf)
687 return -1;
688 if (! xf && yf)
689 return 1;
691 return non_numeric_forward (P_x, P_y);
694 /* This sort routine is used by sort_symbols_by_size. It is sorting
695 an array of size_sym structures into size order. */
697 static int
698 size_forward2 (const void *P_x, const void *P_y)
700 const struct size_sym *x = (const struct size_sym *) P_x;
701 const struct size_sym *y = (const struct size_sym *) P_y;
703 if (x->size < y->size)
704 return reverse_sort ? 1 : -1;
705 else if (x->size > y->size)
706 return reverse_sort ? -1 : 1;
707 else
708 return sorters[0][reverse_sort] (x->minisym, y->minisym);
711 /* Sort the symbols by size. ELF provides a size but for other formats
712 we have to make a guess by assuming that the difference between the
713 address of a symbol and the address of the next higher symbol is the
714 size. */
716 static long
717 sort_symbols_by_size (bfd *abfd, bfd_boolean is_dynamic, void *minisyms,
718 long symcount, unsigned int size,
719 struct size_sym **symsizesp)
721 struct size_sym *symsizes;
722 bfd_byte *from, *fromend;
723 asymbol *sym = NULL;
724 asymbol *store_sym, *store_next;
726 qsort (minisyms, symcount, size, size_forward1);
728 /* We are going to return a special set of symbols and sizes to
729 print. */
730 symsizes = (struct size_sym *) xmalloc (symcount * sizeof (struct size_sym));
731 *symsizesp = symsizes;
733 /* Note that filter_symbols has already removed all absolute and
734 undefined symbols. Here we remove all symbols whose size winds
735 up as zero. */
736 from = (bfd_byte *) minisyms;
737 fromend = from + symcount * size;
739 store_sym = sort_x;
740 store_next = sort_y;
742 if (from < fromend)
744 sym = bfd_minisymbol_to_symbol (abfd, is_dynamic, (const void *) from,
745 store_sym);
746 if (sym == NULL)
747 bfd_fatal (bfd_get_filename (abfd));
750 for (; from < fromend; from += size)
752 asymbol *next;
753 asection *sec;
754 bfd_vma sz;
755 asymbol *temp;
757 if (from + size < fromend)
759 next = bfd_minisymbol_to_symbol (abfd,
760 is_dynamic,
761 (const void *) (from + size),
762 store_next);
763 if (next == NULL)
764 bfd_fatal (bfd_get_filename (abfd));
766 else
767 next = NULL;
769 sec = bfd_get_section (sym);
771 /* Synthetic symbols don't have a full type set of data available, thus
772 we can't rely on that information for the symbol size. Ditto for
773 bfd/section.c:global_syms like *ABS*. */
774 if ((sym->flags & (BSF_SECTION_SYM | BSF_SYNTHETIC)) == 0
775 && bfd_get_flavour (abfd) == bfd_target_elf_flavour)
776 sz = ((elf_symbol_type *) sym)->internal_elf_sym.st_size;
777 else if ((sym->flags & (BSF_SECTION_SYM | BSF_SYNTHETIC)) == 0
778 && bfd_is_com_section (sec))
779 sz = sym->value;
780 else
782 if (from + size < fromend
783 && sec == bfd_get_section (next))
784 sz = valueof (next) - valueof (sym);
785 else
786 sz = (bfd_get_section_vma (abfd, sec)
787 + bfd_section_size (abfd, sec)
788 - valueof (sym));
791 if (sz != 0)
793 symsizes->minisym = (const void *) from;
794 symsizes->size = sz;
795 ++symsizes;
798 sym = next;
800 temp = store_sym;
801 store_sym = store_next;
802 store_next = temp;
805 symcount = symsizes - *symsizesp;
807 /* We must now sort again by size. */
808 qsort ((void *) *symsizesp, symcount, sizeof (struct size_sym), size_forward2);
810 return symcount;
813 /* This function is used to get the relocs for a particular section.
814 It is called via bfd_map_over_sections. */
816 static void
817 get_relocs (bfd *abfd, asection *sec, void *dataarg)
819 struct get_relocs_info *data = (struct get_relocs_info *) dataarg;
821 *data->secs = sec;
823 if ((sec->flags & SEC_RELOC) == 0)
825 *data->relocs = NULL;
826 *data->relcount = 0;
828 else
830 long relsize;
832 relsize = bfd_get_reloc_upper_bound (abfd, sec);
833 if (relsize < 0)
834 bfd_fatal (bfd_get_filename (abfd));
836 *data->relocs = (arelent **) xmalloc (relsize);
837 *data->relcount = bfd_canonicalize_reloc (abfd, sec, *data->relocs,
838 data->syms);
839 if (*data->relcount < 0)
840 bfd_fatal (bfd_get_filename (abfd));
843 ++data->secs;
844 ++data->relocs;
845 ++data->relcount;
848 /* Print a single symbol. */
850 static void
851 print_symbol (bfd * abfd,
852 asymbol * sym,
853 bfd_vma ssize,
854 bfd * archive_bfd)
856 symbol_info syminfo;
857 struct extended_symbol_info info;
859 PROGRESS (1);
861 format->print_symbol_filename (archive_bfd, abfd);
863 bfd_get_symbol_info (abfd, sym, &syminfo);
865 info.sinfo = &syminfo;
866 info.ssize = ssize;
867 /* Synthetic symbols do not have a full symbol type set of data available.
868 Nor do bfd/section.c:global_syms like *ABS*. */
869 if ((sym->flags & (BSF_SECTION_SYM | BSF_SYNTHETIC)) != 0)
871 info.elfinfo = NULL;
872 info.coffinfo = NULL;
874 else
876 info.elfinfo = elf_symbol_from (abfd, sym);
877 info.coffinfo = coff_symbol_from (sym);
880 format->print_symbol_info (&info, abfd);
882 if (with_symbol_versions)
884 const char * version_string = NULL;
885 bfd_boolean hidden = FALSE;
887 if ((sym->flags & (BSF_SECTION_SYM | BSF_SYNTHETIC)) == 0)
888 version_string = bfd_get_symbol_version_string (abfd, sym, &hidden);
890 if (bfd_is_und_section (bfd_get_section (sym)))
891 hidden = TRUE;
893 if (version_string && *version_string != '\0')
894 printf (hidden ? "@%s" : "@@%s", version_string);
897 if (line_numbers)
899 static asymbol **syms;
900 static long symcount;
901 const char *filename, *functionname;
902 unsigned int lineno;
904 /* We need to get the canonical symbols in order to call
905 bfd_find_nearest_line. This is inefficient, but, then, you
906 don't have to use --line-numbers. */
907 if (abfd != lineno_cache_bfd && syms != NULL)
909 free (syms);
910 syms = NULL;
912 if (syms == NULL)
914 long symsize;
916 symsize = bfd_get_symtab_upper_bound (abfd);
917 if (symsize < 0)
918 bfd_fatal (bfd_get_filename (abfd));
919 syms = (asymbol **) xmalloc (symsize);
920 symcount = bfd_canonicalize_symtab (abfd, syms);
921 if (symcount < 0)
922 bfd_fatal (bfd_get_filename (abfd));
923 lineno_cache_bfd = abfd;
926 if (bfd_is_und_section (bfd_get_section (sym)))
928 static asection **secs;
929 static arelent ***relocs;
930 static long *relcount;
931 static unsigned int seccount;
932 unsigned int i;
933 const char *symname;
935 /* For an undefined symbol, we try to find a reloc for the
936 symbol, and print the line number of the reloc. */
937 if (abfd != lineno_cache_rel_bfd && relocs != NULL)
939 for (i = 0; i < seccount; i++)
940 if (relocs[i] != NULL)
941 free (relocs[i]);
942 free (secs);
943 free (relocs);
944 free (relcount);
945 secs = NULL;
946 relocs = NULL;
947 relcount = NULL;
950 if (relocs == NULL)
952 struct get_relocs_info rinfo;
954 seccount = bfd_count_sections (abfd);
956 secs = (asection **) xmalloc (seccount * sizeof *secs);
957 relocs = (arelent ***) xmalloc (seccount * sizeof *relocs);
958 relcount = (long *) xmalloc (seccount * sizeof *relcount);
960 rinfo.secs = secs;
961 rinfo.relocs = relocs;
962 rinfo.relcount = relcount;
963 rinfo.syms = syms;
964 bfd_map_over_sections (abfd, get_relocs, (void *) &rinfo);
965 lineno_cache_rel_bfd = abfd;
968 symname = bfd_asymbol_name (sym);
969 for (i = 0; i < seccount; i++)
971 long j;
973 for (j = 0; j < relcount[i]; j++)
975 arelent *r;
977 r = relocs[i][j];
978 if (r->sym_ptr_ptr != NULL
979 && (*r->sym_ptr_ptr)->section == sym->section
980 && (*r->sym_ptr_ptr)->value == sym->value
981 && strcmp (symname,
982 bfd_asymbol_name (*r->sym_ptr_ptr)) == 0
983 && bfd_find_nearest_line (abfd, secs[i], syms,
984 r->address, &filename,
985 &functionname, &lineno)
986 && filename != NULL)
988 /* We only print the first one we find. */
989 printf ("\t%s:%u", filename, lineno);
990 i = seccount;
991 break;
996 else if (bfd_get_section (sym)->owner == abfd)
998 if ((bfd_find_line (abfd, syms, sym, &filename, &lineno)
999 || bfd_find_nearest_line (abfd, bfd_get_section (sym),
1000 syms, sym->value, &filename,
1001 &functionname, &lineno))
1002 && filename != NULL
1003 && lineno != 0)
1004 printf ("\t%s:%u", filename, lineno);
1008 putchar ('\n');
1011 /* Print the symbols when sorting by size. */
1013 static void
1014 print_size_symbols (bfd * abfd,
1015 bfd_boolean is_dynamic,
1016 struct size_sym * symsizes,
1017 long symcount,
1018 bfd * archive_bfd)
1020 asymbol *store;
1021 struct size_sym *from;
1022 struct size_sym *fromend;
1024 store = bfd_make_empty_symbol (abfd);
1025 if (store == NULL)
1026 bfd_fatal (bfd_get_filename (abfd));
1028 from = symsizes;
1029 fromend = from + symcount;
1031 for (; from < fromend; from++)
1033 asymbol *sym;
1035 sym = bfd_minisymbol_to_symbol (abfd, is_dynamic, from->minisym, store);
1036 if (sym == NULL)
1037 bfd_fatal (bfd_get_filename (abfd));
1039 print_symbol (abfd, sym, from->size, archive_bfd);
1044 /* Print the symbols of ABFD that are held in MINISYMS.
1046 If ARCHIVE_BFD is non-NULL, it is the archive containing ABFD.
1048 SYMCOUNT is the number of symbols in MINISYMS.
1050 SIZE is the size of a symbol in MINISYMS. */
1052 static void
1053 print_symbols (bfd * abfd,
1054 bfd_boolean is_dynamic,
1055 void * minisyms,
1056 long symcount,
1057 unsigned int size,
1058 bfd * archive_bfd)
1060 asymbol *store;
1061 bfd_byte *from;
1062 bfd_byte *fromend;
1064 store = bfd_make_empty_symbol (abfd);
1065 if (store == NULL)
1066 bfd_fatal (bfd_get_filename (abfd));
1068 from = (bfd_byte *) minisyms;
1069 fromend = from + symcount * size;
1071 for (; from < fromend; from += size)
1073 asymbol *sym;
1075 sym = bfd_minisymbol_to_symbol (abfd, is_dynamic, from, store);
1076 if (sym == NULL)
1077 bfd_fatal (bfd_get_filename (abfd));
1079 print_symbol (abfd, sym, (bfd_vma) 0, archive_bfd);
1083 /* If ARCHIVE_BFD is non-NULL, it is the archive containing ABFD. */
1085 static void
1086 display_rel_file (bfd *abfd, bfd *archive_bfd)
1088 long symcount;
1089 void *minisyms;
1090 unsigned int size;
1091 struct size_sym *symsizes;
1092 asymbol *synthsyms = NULL;
1094 if (! dynamic)
1096 if (!(bfd_get_file_flags (abfd) & HAS_SYMS))
1098 non_fatal (_("%s: no symbols"), bfd_get_filename (abfd));
1099 return;
1103 symcount = bfd_read_minisymbols (abfd, dynamic, &minisyms, &size);
1104 if (symcount < 0)
1106 if (dynamic && bfd_get_error () == bfd_error_no_symbols)
1108 non_fatal (_("%s: no symbols"), bfd_get_filename (abfd));
1109 return;
1112 bfd_fatal (bfd_get_filename (abfd));
1115 if (symcount == 0)
1117 non_fatal (_("%s: no symbols"), bfd_get_filename (abfd));
1118 return;
1121 if (show_synthetic && size == sizeof (asymbol *))
1123 asymbol **static_syms = NULL;
1124 asymbol **dyn_syms = NULL;
1125 long static_count = 0;
1126 long dyn_count = 0;
1127 long synth_count;
1129 if (dynamic)
1131 dyn_count = symcount;
1132 dyn_syms = (asymbol **) minisyms;
1134 else
1136 long storage = bfd_get_dynamic_symtab_upper_bound (abfd);
1138 static_count = symcount;
1139 static_syms = (asymbol **) minisyms;
1141 if (storage > 0)
1143 dyn_syms = (asymbol **) xmalloc (storage);
1144 dyn_count = bfd_canonicalize_dynamic_symtab (abfd, dyn_syms);
1145 if (dyn_count < 0)
1146 bfd_fatal (bfd_get_filename (abfd));
1150 synth_count = bfd_get_synthetic_symtab (abfd, static_count, static_syms,
1151 dyn_count, dyn_syms, &synthsyms);
1152 if (synth_count > 0)
1154 asymbol **symp;
1155 long i;
1157 minisyms = xrealloc (minisyms,
1158 (symcount + synth_count + 1) * sizeof (*symp));
1159 symp = (asymbol **) minisyms + symcount;
1160 for (i = 0; i < synth_count; i++)
1161 *symp++ = synthsyms + i;
1162 *symp = 0;
1163 symcount += synth_count;
1167 /* Discard the symbols we don't want to print.
1168 It's OK to do this in place; we'll free the storage anyway
1169 (after printing). */
1171 symcount = filter_symbols (abfd, dynamic, minisyms, symcount, size);
1173 symsizes = NULL;
1174 if (! no_sort)
1176 sort_bfd = abfd;
1177 sort_dynamic = dynamic;
1178 sort_x = bfd_make_empty_symbol (abfd);
1179 sort_y = bfd_make_empty_symbol (abfd);
1180 if (sort_x == NULL || sort_y == NULL)
1181 bfd_fatal (bfd_get_filename (abfd));
1183 if (! sort_by_size)
1184 qsort (minisyms, symcount, size,
1185 sorters[sort_numerically][reverse_sort]);
1186 else
1187 symcount = sort_symbols_by_size (abfd, dynamic, minisyms, symcount,
1188 size, &symsizes);
1191 if (! sort_by_size)
1192 print_symbols (abfd, dynamic, minisyms, symcount, size, archive_bfd);
1193 else
1194 print_size_symbols (abfd, dynamic, symsizes, symcount, archive_bfd);
1196 if (synthsyms)
1197 free (synthsyms);
1198 free (minisyms);
1199 free (symsizes);
1202 static void
1203 set_print_width (bfd *file)
1205 print_width = bfd_get_arch_size (file);
1207 if (print_width == -1)
1209 /* PR binutils/4292
1210 Guess the target's bitsize based on its name.
1211 We assume here than any 64-bit format will include
1212 "64" somewhere in its name. The only known exception
1213 is the MMO object file format. */
1214 if (strstr (bfd_get_target (file), "64") != NULL
1215 || strcmp (bfd_get_target (file), "mmo") == 0)
1216 print_width = 64;
1217 else
1218 print_width = 32;
1222 static void
1223 display_archive (bfd *file)
1225 bfd *arfile = NULL;
1226 bfd *last_arfile = NULL;
1227 char **matching;
1229 format->print_archive_filename (bfd_get_filename (file));
1231 if (print_armap)
1232 print_symdef_entry (file);
1234 for (;;)
1236 PROGRESS (1);
1238 arfile = bfd_openr_next_archived_file (file, arfile);
1240 if (arfile == NULL)
1242 if (bfd_get_error () != bfd_error_no_more_archived_files)
1243 bfd_fatal (bfd_get_filename (file));
1244 break;
1247 if (bfd_check_format_matches (arfile, bfd_object, &matching))
1249 set_print_width (arfile);
1250 format->print_archive_member (bfd_get_filename (file),
1251 bfd_get_filename (arfile));
1252 display_rel_file (arfile, file);
1254 else
1256 bfd_nonfatal (bfd_get_filename (arfile));
1257 if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
1259 list_matching_formats (matching);
1260 free (matching);
1264 if (last_arfile != NULL)
1266 bfd_close (last_arfile);
1267 lineno_cache_bfd = NULL;
1268 lineno_cache_rel_bfd = NULL;
1269 if (arfile == last_arfile)
1270 return;
1272 last_arfile = arfile;
1275 if (last_arfile != NULL)
1277 bfd_close (last_arfile);
1278 lineno_cache_bfd = NULL;
1279 lineno_cache_rel_bfd = NULL;
1283 static bfd_boolean
1284 display_file (char *filename)
1286 bfd_boolean retval = TRUE;
1287 bfd *file;
1288 char **matching;
1290 if (get_file_size (filename) < 1)
1291 return FALSE;
1293 file = bfd_openr (filename, target ? target : plugin_target);
1294 if (file == NULL)
1296 bfd_nonfatal (filename);
1297 return FALSE;
1300 /* If printing line numbers, decompress the debug sections. */
1301 if (line_numbers)
1302 file->flags |= BFD_DECOMPRESS;
1304 if (bfd_check_format (file, bfd_archive))
1306 display_archive (file);
1308 else if (bfd_check_format_matches (file, bfd_object, &matching))
1310 set_print_width (file);
1311 format->print_object_filename (filename);
1312 display_rel_file (file, NULL);
1314 else
1316 bfd_nonfatal (filename);
1317 if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
1319 list_matching_formats (matching);
1320 free (matching);
1322 retval = FALSE;
1325 if (!bfd_close (file))
1326 bfd_fatal (filename);
1328 lineno_cache_bfd = NULL;
1329 lineno_cache_rel_bfd = NULL;
1331 return retval;
1334 /* The following 3 groups of functions are called unconditionally,
1335 once at the start of processing each file of the appropriate type.
1336 They should check `filename_per_file' and `filename_per_symbol',
1337 as appropriate for their output format, to determine whether to
1338 print anything. */
1340 /* Print the name of an object file given on the command line. */
1342 static void
1343 print_object_filename_bsd (char *filename)
1345 if (filename_per_file && !filename_per_symbol)
1346 printf ("\n%s:\n", filename);
1349 static void
1350 print_object_filename_sysv (char *filename)
1352 if (undefined_only)
1353 printf (_("\n\nUndefined symbols from %s:\n\n"), filename);
1354 else
1355 printf (_("\n\nSymbols from %s:\n\n"), filename);
1356 if (print_width == 32)
1357 printf (_("\
1358 Name Value Class Type Size Line Section\n\n"));
1359 else
1360 printf (_("\
1361 Name Value Class Type Size Line Section\n\n"));
1364 static void
1365 print_object_filename_posix (char *filename)
1367 if (filename_per_file && !filename_per_symbol)
1368 printf ("%s:\n", filename);
1371 /* Print the name of an archive file given on the command line. */
1373 static void
1374 print_archive_filename_bsd (char *filename)
1376 if (filename_per_file)
1377 printf ("\n%s:\n", filename);
1380 static void
1381 print_archive_filename_sysv (char *filename ATTRIBUTE_UNUSED)
1385 static void
1386 print_archive_filename_posix (char *filename ATTRIBUTE_UNUSED)
1390 /* Print the name of an archive member file. */
1392 static void
1393 print_archive_member_bsd (char *archive ATTRIBUTE_UNUSED,
1394 const char *filename)
1396 if (!filename_per_symbol)
1397 printf ("\n%s:\n", filename);
1400 static void
1401 print_archive_member_sysv (char *archive, const char *filename)
1403 if (undefined_only)
1404 printf (_("\n\nUndefined symbols from %s[%s]:\n\n"), archive, filename);
1405 else
1406 printf (_("\n\nSymbols from %s[%s]:\n\n"), archive, filename);
1407 if (print_width == 32)
1408 printf (_("\
1409 Name Value Class Type Size Line Section\n\n"));
1410 else
1411 printf (_("\
1412 Name Value Class Type Size Line Section\n\n"));
1415 static void
1416 print_archive_member_posix (char *archive, const char *filename)
1418 if (!filename_per_symbol)
1419 printf ("%s[%s]:\n", archive, filename);
1422 /* Print the name of the file (and archive, if there is one)
1423 containing a symbol. */
1425 static void
1426 print_symbol_filename_bsd (bfd *archive_bfd, bfd *abfd)
1428 if (filename_per_symbol)
1430 if (archive_bfd)
1431 printf ("%s:", bfd_get_filename (archive_bfd));
1432 printf ("%s:", bfd_get_filename (abfd));
1436 static void
1437 print_symbol_filename_sysv (bfd *archive_bfd, bfd *abfd)
1439 if (filename_per_symbol)
1441 if (archive_bfd)
1442 printf ("%s:", bfd_get_filename (archive_bfd));
1443 printf ("%s:", bfd_get_filename (abfd));
1447 static void
1448 print_symbol_filename_posix (bfd *archive_bfd, bfd *abfd)
1450 if (filename_per_symbol)
1452 if (archive_bfd)
1453 printf ("%s[%s]: ", bfd_get_filename (archive_bfd),
1454 bfd_get_filename (abfd));
1455 else
1456 printf ("%s: ", bfd_get_filename (abfd));
1460 /* Construct a formatting string for printing symbol values. */
1462 static const char *
1463 get_print_format (void)
1465 static const char * saved_format = NULL;
1467 /* See if we have already constructed the format. */
1468 if (saved_format)
1469 return saved_format;
1471 const char * padding;
1472 if (print_format == FORMAT_POSIX)
1474 /* POSIX compatible output does not have any padding. */
1475 padding = "";
1477 else if (print_width == 32)
1479 padding ="08";
1481 else /* print_width == 64 */
1483 padding = "016";
1486 const char * length = "l";
1487 if (print_width == 64)
1489 #if BFD_HOST_64BIT_LONG
1491 #elif BFD_HOST_64BIT_LONG_LONG
1492 #ifndef __MSVCRT__
1493 length = "ll";
1494 #else
1495 length = "I64";
1496 #endif
1497 #endif
1500 const char * radix = NULL;
1501 switch (print_radix)
1503 case 8: radix = "o"; break;
1504 case 10: radix = "d"; break;
1505 case 16: radix = "x"; break;
1508 saved_format = concat ("%", padding, length, radix, NULL);
1509 return saved_format;
1512 /* Print a symbol value. */
1514 static void
1515 print_value (bfd *abfd ATTRIBUTE_UNUSED, bfd_vma val)
1517 switch (print_width)
1519 case 32:
1520 printf (get_print_format (), (unsigned long) val);
1521 break;
1523 case 64:
1524 #if BFD_HOST_64BIT_LONG || BFD_HOST_64BIT_LONG_LONG
1525 printf (get_print_format (), val);
1526 #else
1527 /* We have a 64 bit value to print, but the host is only 32 bit. */
1528 if (print_radix == 16)
1529 bfd_fprintf_vma (abfd, stdout, val);
1530 else
1532 char buf[30];
1533 char *s;
1535 s = buf + sizeof buf;
1536 *--s = '\0';
1537 while (val > 0)
1539 *--s = (val % print_radix) + '0';
1540 val /= print_radix;
1542 while ((buf + sizeof buf - 1) - s < 16)
1543 *--s = '0';
1544 printf ("%s", s);
1546 #endif
1547 break;
1549 default:
1550 fatal (_("Print width has not been initialized (%d)"), print_width);
1551 break;
1555 /* Print a line of information about a symbol. */
1557 static void
1558 print_symbol_info_bsd (struct extended_symbol_info *info, bfd *abfd)
1560 if (bfd_is_undefined_symclass (SYM_TYPE (info)))
1562 if (print_width == 64)
1563 printf (" ");
1564 printf (" ");
1566 else
1568 /* Normally we print the value of the symbol. If we are printing the
1569 size or sorting by size then we print its size, except for the
1570 (weird) special case where both flags are defined, in which case we
1571 print both values. This conforms to documented behaviour. */
1572 if (sort_by_size && !print_size)
1573 print_value (abfd, SYM_SIZE (info));
1574 else
1575 print_value (abfd, SYM_VALUE (info));
1576 if (print_size && SYM_SIZE (info))
1578 printf (" ");
1579 print_value (abfd, SYM_SIZE (info));
1583 printf (" %c", SYM_TYPE (info));
1585 if (SYM_TYPE (info) == '-')
1587 /* A stab. */
1588 printf (" ");
1589 printf (other_format, SYM_STAB_OTHER (info));
1590 printf (" ");
1591 printf (desc_format, SYM_STAB_DESC (info));
1592 printf (" %5s", SYM_STAB_NAME (info));
1594 print_symname (" %s", SYM_NAME (info), abfd);
1597 static void
1598 print_symbol_info_sysv (struct extended_symbol_info *info, bfd *abfd)
1600 print_symname ("%-20s|", SYM_NAME (info), abfd);
1602 if (bfd_is_undefined_symclass (SYM_TYPE (info)))
1604 if (print_width == 32)
1605 printf (" ");
1606 else
1607 printf (" ");
1609 else
1610 print_value (abfd, SYM_VALUE (info));
1612 printf ("| %c |", SYM_TYPE (info));
1614 if (SYM_TYPE (info) == '-')
1616 /* A stab. */
1617 printf ("%18s| ", SYM_STAB_NAME (info)); /* (C) Type. */
1618 printf (desc_format, SYM_STAB_DESC (info)); /* Size. */
1619 printf ("| |"); /* Line, Section. */
1621 else
1623 /* Type, Size, Line, Section */
1624 if (info->elfinfo)
1625 printf ("%18s|",
1626 get_elf_symbol_type (ELF_ST_TYPE (info->elfinfo->internal_elf_sym.st_info)));
1627 else if (info->coffinfo)
1628 printf ("%18s|",
1629 get_coff_symbol_type (&info->coffinfo->native->u.syment));
1630 else
1631 printf (" |");
1633 if (SYM_SIZE (info))
1634 print_value (abfd, SYM_SIZE (info));
1635 else
1637 if (print_width == 32)
1638 printf (" ");
1639 else
1640 printf (" ");
1643 if (info->elfinfo)
1644 printf("| |%s", info->elfinfo->symbol.section->name);
1645 else if (info->coffinfo)
1646 printf("| |%s", info->coffinfo->symbol.section->name);
1647 else
1648 printf("| |");
1652 static void
1653 print_symbol_info_posix (struct extended_symbol_info *info, bfd *abfd)
1655 print_symname ("%s ", SYM_NAME (info), abfd);
1656 printf ("%c ", SYM_TYPE (info));
1658 if (bfd_is_undefined_symclass (SYM_TYPE (info)))
1659 printf (" ");
1660 else
1662 print_value (abfd, SYM_VALUE (info));
1663 printf (" ");
1664 if (SYM_SIZE (info))
1665 print_value (abfd, SYM_SIZE (info));
1670 main (int argc, char **argv)
1672 int c;
1673 int retval;
1675 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
1676 setlocale (LC_MESSAGES, "");
1677 #endif
1678 #if defined (HAVE_SETLOCALE)
1679 setlocale (LC_CTYPE, "");
1680 setlocale (LC_COLLATE, "");
1681 #endif
1682 bindtextdomain (PACKAGE, LOCALEDIR);
1683 textdomain (PACKAGE);
1685 program_name = *argv;
1686 xmalloc_set_program_name (program_name);
1687 bfd_set_error_program_name (program_name);
1688 #if BFD_SUPPORTS_PLUGINS
1689 bfd_plugin_set_program_name (program_name);
1690 #endif
1692 START_PROGRESS (program_name, 0);
1694 expandargv (&argc, &argv);
1696 if (bfd_init () != BFD_INIT_MAGIC)
1697 fatal (_("fatal error: libbfd ABI mismatch"));
1698 set_default_bfd_target ();
1700 while ((c = getopt_long (argc, argv, "aABCDef:gHhlnopPrSst:uvVvX:",
1701 long_options, (int *) 0)) != EOF)
1703 switch (c)
1705 case 'a':
1706 print_debug_syms = 1;
1707 break;
1708 case 'A':
1709 case 'o':
1710 filename_per_symbol = 1;
1711 break;
1712 case 'B': /* For MIPS compatibility. */
1713 set_output_format ("bsd");
1714 break;
1715 case 'C':
1716 do_demangle = 1;
1717 if (optarg != NULL)
1719 enum demangling_styles style;
1721 style = cplus_demangle_name_to_style (optarg);
1722 if (style == unknown_demangling)
1723 fatal (_("unknown demangling style `%s'"),
1724 optarg);
1726 cplus_demangle_set_style (style);
1728 break;
1729 case OPTION_RECURSE_LIMIT:
1730 demangle_flags &= ~ DMGL_NO_RECURSE_LIMIT;
1731 break;
1732 case OPTION_NO_RECURSE_LIMIT:
1733 demangle_flags |= DMGL_NO_RECURSE_LIMIT;
1734 break;
1735 case 'D':
1736 dynamic = 1;
1737 break;
1738 case 'e':
1739 /* Ignored for HP/UX compatibility. */
1740 break;
1741 case 'f':
1742 set_output_format (optarg);
1743 break;
1744 case 'g':
1745 external_only = 1;
1746 break;
1747 case 'H':
1748 case 'h':
1749 usage (stdout, 0);
1750 case 'l':
1751 line_numbers = 1;
1752 break;
1753 case 'n':
1754 case 'v':
1755 no_sort = 0;
1756 sort_numerically = 1;
1757 sort_by_size = 0;
1758 break;
1759 case 'p':
1760 no_sort = 1;
1761 sort_numerically = 0;
1762 sort_by_size = 0;
1763 break;
1764 case OPTION_SIZE_SORT:
1765 no_sort = 0;
1766 sort_numerically = 0;
1767 sort_by_size = 1;
1768 break;
1769 case 'P':
1770 set_output_format ("posix");
1771 break;
1772 case 'r':
1773 reverse_sort = 1;
1774 break;
1775 case 's':
1776 print_armap = 1;
1777 break;
1778 case 'S':
1779 print_size = 1;
1780 break;
1781 case 't':
1782 set_print_radix (optarg);
1783 break;
1784 case 'u':
1785 undefined_only = 1;
1786 break;
1787 case 'V':
1788 show_version = 1;
1789 break;
1790 case 'X':
1791 /* Ignored for (partial) AIX compatibility. On AIX, the
1792 argument has values 32, 64, or 32_64, and specifies that
1793 only 32-bit, only 64-bit, or both kinds of objects should
1794 be examined. The default is 32. So plain AIX nm on a
1795 library archive with both kinds of objects will ignore
1796 the 64-bit ones. For GNU nm, the default is and always
1797 has been -X 32_64, and other options are not supported. */
1798 if (strcmp (optarg, "32_64") != 0)
1799 fatal (_("Only -X 32_64 is supported"));
1800 break;
1802 case OPTION_TARGET: /* --target */
1803 target = optarg;
1804 break;
1806 case OPTION_PLUGIN: /* --plugin */
1807 #if BFD_SUPPORTS_PLUGINS
1808 bfd_plugin_set_plugin (optarg);
1809 #else
1810 fatal (_("sorry - this program has been built without plugin support\n"));
1811 #endif
1812 break;
1814 case 0: /* A long option that just sets a flag. */
1815 break;
1817 default:
1818 usage (stderr, 1);
1822 if (show_version)
1823 print_version ("nm");
1825 if (sort_by_size && undefined_only)
1827 non_fatal (_("Using the --size-sort and --undefined-only options together"));
1828 non_fatal (_("will produce no output, since undefined symbols have no size."));
1829 return 0;
1832 /* OK, all options now parsed. If no filename specified, do a.out. */
1833 if (optind == argc)
1834 return !display_file ("a.out");
1836 retval = 0;
1838 if (argc - optind > 1)
1839 filename_per_file = 1;
1841 /* We were given several filenames to do. */
1842 while (optind < argc)
1844 PROGRESS (1);
1845 if (!display_file (argv[optind++]))
1846 retval++;
1849 END_PROGRESS (program_name);
1851 exit (retval);
1852 return retval;