Add -Wshadow to the gcc command line options used when compiling the binutils.
[binutils.git] / binutils / nm.c
blob5ad9c2060e5553fe9ad4b120b15f05f993d23c81
1 /* nm.c -- Describe symbol table of a rel file.
2 Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
3 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009
4 Free Software Foundation, Inc.
6 This file is part of GNU Binutils.
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
21 02110-1301, USA. */
23 #include "sysdep.h"
24 #include "bfd.h"
25 #include "progress.h"
26 #include "getopt.h"
27 #include "aout/stab_gnu.h"
28 #include "aout/ranlib.h"
29 #include "demangle.h"
30 #include "libiberty.h"
31 #include "elf-bfd.h"
32 #include "elf/common.h"
33 #include "bucomm.h"
34 #include "plugin.h"
36 /* When sorting by size, we use this structure to hold the size and a
37 pointer to the minisymbol. */
39 struct size_sym
41 const void *minisym;
42 bfd_vma size;
45 /* When fetching relocs, we use this structure to pass information to
46 get_relocs. */
48 struct get_relocs_info
50 asection **secs;
51 arelent ***relocs;
52 long *relcount;
53 asymbol **syms;
56 struct extended_symbol_info
58 symbol_info *sinfo;
59 bfd_vma ssize;
60 elf_symbol_type *elfinfo;
61 /* FIXME: We should add more fields for Type, Line, Section. */
63 #define SYM_NAME(sym) (sym->sinfo->name)
64 #define SYM_VALUE(sym) (sym->sinfo->value)
65 #define SYM_TYPE(sym) (sym->sinfo->type)
66 #define SYM_STAB_NAME(sym) (sym->sinfo->stab_name)
67 #define SYM_STAB_DESC(sym) (sym->sinfo->stab_desc)
68 #define SYM_STAB_OTHER(sym) (sym->sinfo->stab_other)
69 #define SYM_SIZE(sym) \
70 (sym->elfinfo ? sym->elfinfo->internal_elf_sym.st_size: sym->ssize)
72 /* The output formatting functions. */
73 static void print_object_filename_bsd (char *);
74 static void print_object_filename_sysv (char *);
75 static void print_object_filename_posix (char *);
76 static void print_archive_filename_bsd (char *);
77 static void print_archive_filename_sysv (char *);
78 static void print_archive_filename_posix (char *);
79 static void print_archive_member_bsd (char *, const char *);
80 static void print_archive_member_sysv (char *, const char *);
81 static void print_archive_member_posix (char *, const char *);
82 static void print_symbol_filename_bsd (bfd *, bfd *);
83 static void print_symbol_filename_sysv (bfd *, bfd *);
84 static void print_symbol_filename_posix (bfd *, bfd *);
85 static void print_value (bfd *, bfd_vma);
86 static void print_symbol_info_bsd (struct extended_symbol_info *, bfd *);
87 static void print_symbol_info_sysv (struct extended_symbol_info *, bfd *);
88 static void print_symbol_info_posix (struct extended_symbol_info *, bfd *);
90 /* Support for different output formats. */
91 struct output_fns
93 /* Print the name of an object file given on the command line. */
94 void (*print_object_filename) (char *);
96 /* Print the name of an archive file given on the command line. */
97 void (*print_archive_filename) (char *);
99 /* Print the name of an archive member file. */
100 void (*print_archive_member) (char *, const char *);
102 /* Print the name of the file (and archive, if there is one)
103 containing a symbol. */
104 void (*print_symbol_filename) (bfd *, bfd *);
106 /* Print a line of information about a symbol. */
107 void (*print_symbol_info) (struct extended_symbol_info *, bfd *);
110 static struct output_fns formats[] =
112 {print_object_filename_bsd,
113 print_archive_filename_bsd,
114 print_archive_member_bsd,
115 print_symbol_filename_bsd,
116 print_symbol_info_bsd},
117 {print_object_filename_sysv,
118 print_archive_filename_sysv,
119 print_archive_member_sysv,
120 print_symbol_filename_sysv,
121 print_symbol_info_sysv},
122 {print_object_filename_posix,
123 print_archive_filename_posix,
124 print_archive_member_posix,
125 print_symbol_filename_posix,
126 print_symbol_info_posix}
129 /* Indices in `formats'. */
130 #define FORMAT_BSD 0
131 #define FORMAT_SYSV 1
132 #define FORMAT_POSIX 2
133 #define FORMAT_DEFAULT FORMAT_BSD
135 /* The output format to use. */
136 static struct output_fns *format = &formats[FORMAT_DEFAULT];
138 /* Command options. */
140 static int do_demangle = 0; /* Pretty print C++ symbol names. */
141 static int external_only = 0; /* Print external symbols only. */
142 static int defined_only = 0; /* Print defined symbols only. */
143 static int no_sort = 0; /* Don't sort; print syms in order found. */
144 static int print_debug_syms = 0;/* Print debugger-only symbols too. */
145 static int print_armap = 0; /* Describe __.SYMDEF data in archive files. */
146 static int print_size = 0; /* Print size of defined symbols. */
147 static int reverse_sort = 0; /* Sort in downward(alpha or numeric) order. */
148 static int sort_numerically = 0;/* Sort in numeric rather than alpha order. */
149 static int sort_by_size = 0; /* Sort by size of symbol. */
150 static int undefined_only = 0; /* Print undefined symbols only. */
151 static int dynamic = 0; /* Print dynamic symbols. */
152 static int show_version = 0; /* Show the version number. */
153 static int show_stats = 0; /* Show statistics. */
154 static int show_synthetic = 0; /* Display synthesized symbols too. */
155 static int line_numbers = 0; /* Print line numbers for symbols. */
156 static int allow_special_symbols = 0; /* Allow special symbols. */
158 /* When to print the names of files. Not mutually exclusive in SYSV format. */
159 static int filename_per_file = 0; /* Once per file, on its own line. */
160 static int filename_per_symbol = 0; /* Once per symbol, at start of line. */
162 /* Print formats for printing a symbol value. */
163 static char value_format_32bit[] = "%08lx";
164 #if BFD_HOST_64BIT_LONG
165 static char value_format_64bit[] = "%016lx";
166 #elif BFD_HOST_64BIT_LONG_LONG
167 static char value_format_64bit[] = "%016llx";
168 #endif
169 static int print_width = 0;
170 static int print_radix = 16;
171 /* Print formats for printing stab info. */
172 static char other_format[] = "%02x";
173 static char desc_format[] = "%04x";
175 static char *target = NULL;
177 /* Used to cache the line numbers for a BFD. */
178 static bfd *lineno_cache_bfd;
179 static bfd *lineno_cache_rel_bfd;
181 #define OPTION_TARGET 200
182 #define OPTION_PLUGIN 201
184 static struct option long_options[] =
186 {"debug-syms", no_argument, &print_debug_syms, 1},
187 {"demangle", optional_argument, 0, 'C'},
188 {"dynamic", no_argument, &dynamic, 1},
189 {"extern-only", no_argument, &external_only, 1},
190 {"format", required_argument, 0, 'f'},
191 {"help", no_argument, 0, 'h'},
192 {"line-numbers", no_argument, 0, 'l'},
193 {"no-cplus", no_argument, &do_demangle, 0}, /* Linux compatibility. */
194 {"no-demangle", no_argument, &do_demangle, 0},
195 {"no-sort", no_argument, &no_sort, 1},
196 {"numeric-sort", no_argument, &sort_numerically, 1},
197 {"plugin", required_argument, 0, OPTION_PLUGIN},
198 {"portability", no_argument, 0, 'P'},
199 {"print-armap", no_argument, &print_armap, 1},
200 {"print-file-name", no_argument, 0, 'o'},
201 {"print-size", no_argument, 0, 'S'},
202 {"radix", required_argument, 0, 't'},
203 {"reverse-sort", no_argument, &reverse_sort, 1},
204 {"size-sort", no_argument, &sort_by_size, 1},
205 {"special-syms", no_argument, &allow_special_symbols, 1},
206 {"stats", no_argument, &show_stats, 1},
207 {"synthetic", no_argument, &show_synthetic, 1},
208 {"target", required_argument, 0, OPTION_TARGET},
209 {"defined-only", no_argument, &defined_only, 1},
210 {"undefined-only", no_argument, &undefined_only, 1},
211 {"version", no_argument, &show_version, 1},
212 {0, no_argument, 0, 0}
215 /* Some error-reporting functions. */
217 static void
218 usage (FILE *stream, int status)
220 fprintf (stream, _("Usage: %s [option(s)] [file(s)]\n"), program_name);
221 fprintf (stream, _(" List symbols in [file(s)] (a.out by default).\n"));
222 fprintf (stream, _(" The options are:\n\
223 -a, --debug-syms Display debugger-only symbols\n\
224 -A, --print-file-name Print name of the input file before every symbol\n\
225 -B Same as --format=bsd\n\
226 -C, --demangle[=STYLE] Decode low-level symbol names into user-level names\n\
227 The STYLE, if specified, can be `auto' (the default),\n\
228 `gnu', `lucid', `arm', `hp', `edg', `gnu-v3', `java'\n\
229 or `gnat'\n\
230 --no-demangle Do not demangle low-level symbol names\n\
231 -D, --dynamic Display dynamic symbols instead of normal symbols\n\
232 --defined-only Display only defined symbols\n\
233 -e (ignored)\n\
234 -f, --format=FORMAT Use the output format FORMAT. FORMAT can be `bsd',\n\
235 `sysv' or `posix'. The default is `bsd'\n\
236 -g, --extern-only Display only external symbols\n\
237 -l, --line-numbers Use debugging information to find a filename and\n\
238 line number for each symbol\n\
239 -n, --numeric-sort Sort symbols numerically by address\n\
240 -o Same as -A\n\
241 -p, --no-sort Do not sort the symbols\n\
242 -P, --portability Same as --format=posix\n\
243 -r, --reverse-sort Reverse the sense of the sort\n"));
244 #if BFD_SUPPORTS_PLUGINS
245 fprintf (stream, _("\
246 --plugin NAME Load the specified plugin\n"));
247 #endif
248 fprintf (stream, _("\
249 -S, --print-size Print size of defined symbols\n \
250 -s, --print-armap Include index for symbols from archive members\n\
251 --size-sort Sort symbols by size\n\
252 --special-syms Include special symbols in the output\n\
253 --synthetic Display synthetic symbols as well\n\
254 -t, --radix=RADIX Use RADIX for printing symbol values\n\
255 --target=BFDNAME Specify the target object format as BFDNAME\n\
256 -u, --undefined-only Display only undefined symbols\n\
257 -X 32_64 (ignored)\n\
258 @FILE Read options from FILE\n\
259 -h, --help Display this information\n\
260 -V, --version Display this program's version number\n\
261 \n"));
262 list_supported_targets (program_name, stream);
263 if (REPORT_BUGS_TO[0] && status == 0)
264 fprintf (stream, _("Report bugs to %s.\n"), REPORT_BUGS_TO);
265 exit (status);
268 /* Set the radix for the symbol value and size according to RADIX. */
270 static void
271 set_print_radix (char *radix)
273 switch (*radix)
275 case 'x':
276 break;
277 case 'd':
278 case 'o':
279 if (*radix == 'd')
280 print_radix = 10;
281 else
282 print_radix = 8;
283 value_format_32bit[4] = *radix;
284 #if BFD_HOST_64BIT_LONG
285 value_format_64bit[5] = *radix;
286 #elif BFD_HOST_64BIT_LONG_LONG
287 value_format_64bit[6] = *radix;
288 #endif
289 other_format[3] = desc_format[3] = *radix;
290 break;
291 default:
292 fatal (_("%s: invalid radix"), radix);
296 static void
297 set_output_format (char *f)
299 int i;
301 switch (*f)
303 case 'b':
304 case 'B':
305 i = FORMAT_BSD;
306 break;
307 case 'p':
308 case 'P':
309 i = FORMAT_POSIX;
310 break;
311 case 's':
312 case 'S':
313 i = FORMAT_SYSV;
314 break;
315 default:
316 fatal (_("%s: invalid output format"), f);
318 format = &formats[i];
321 static const char *
322 get_symbol_type (unsigned int type)
324 static char buff [32];
326 switch (type)
328 case STT_NOTYPE: return "NOTYPE";
329 case STT_OBJECT: return "OBJECT";
330 case STT_FUNC: return "FUNC";
331 case STT_SECTION: return "SECTION";
332 case STT_FILE: return "FILE";
333 case STT_COMMON: return "COMMON";
334 case STT_TLS: return "TLS";
335 default:
336 if (type >= STT_LOPROC && type <= STT_HIPROC)
337 sprintf (buff, _("<processor specific>: %d"), type);
338 else if (type >= STT_LOOS && type <= STT_HIOS)
339 sprintf (buff, _("<OS specific>: %d"), type);
340 else
341 sprintf (buff, _("<unknown>: %d"), type);
342 return buff;
346 /* Print symbol name NAME, read from ABFD, with printf format FORM,
347 demangling it if requested. */
349 static void
350 print_symname (const char *form, const char *name, bfd *abfd)
352 if (do_demangle && *name)
354 char *res = bfd_demangle (abfd, name, DMGL_ANSI | DMGL_PARAMS);
356 if (res != NULL)
358 printf (form, res);
359 free (res);
360 return;
364 printf (form, name);
367 static void
368 print_symdef_entry (bfd *abfd)
370 symindex idx = BFD_NO_MORE_SYMBOLS;
371 carsym *thesym;
372 bfd_boolean everprinted = FALSE;
374 for (idx = bfd_get_next_mapent (abfd, idx, &thesym);
375 idx != BFD_NO_MORE_SYMBOLS;
376 idx = bfd_get_next_mapent (abfd, idx, &thesym))
378 bfd *elt;
379 if (!everprinted)
381 printf (_("\nArchive index:\n"));
382 everprinted = TRUE;
384 elt = bfd_get_elt_at_index (abfd, idx);
385 if (elt == NULL)
386 bfd_fatal ("bfd_get_elt_at_index");
387 if (thesym->name != (char *) NULL)
389 print_symname ("%s", thesym->name, abfd);
390 printf (" in %s\n", bfd_get_filename (elt));
395 /* Choose which symbol entries to print;
396 compact them downward to get rid of the rest.
397 Return the number of symbols to be printed. */
399 static long
400 filter_symbols (bfd *abfd, bfd_boolean is_dynamic, void *minisyms,
401 long symcount, unsigned int size)
403 bfd_byte *from, *fromend, *to;
404 asymbol *store;
406 store = bfd_make_empty_symbol (abfd);
407 if (store == NULL)
408 bfd_fatal (bfd_get_filename (abfd));
410 from = (bfd_byte *) minisyms;
411 fromend = from + symcount * size;
412 to = (bfd_byte *) minisyms;
414 for (; from < fromend; from += size)
416 int keep = 0;
417 asymbol *sym;
419 PROGRESS (1);
421 sym = bfd_minisymbol_to_symbol (abfd, is_dynamic, (const void *) from, store);
422 if (sym == NULL)
423 bfd_fatal (bfd_get_filename (abfd));
425 if (undefined_only)
426 keep = bfd_is_und_section (sym->section);
427 else if (external_only)
428 keep = ((sym->flags & BSF_GLOBAL) != 0
429 || (sym->flags & BSF_WEAK) != 0
430 || bfd_is_und_section (sym->section)
431 || bfd_is_com_section (sym->section));
432 else
433 keep = 1;
435 if (keep
436 && ! print_debug_syms
437 && (sym->flags & BSF_DEBUGGING) != 0)
438 keep = 0;
440 if (keep
441 && sort_by_size
442 && (bfd_is_abs_section (sym->section)
443 || bfd_is_und_section (sym->section)))
444 keep = 0;
446 if (keep
447 && defined_only)
449 if (bfd_is_und_section (sym->section))
450 keep = 0;
453 if (keep
454 && bfd_is_target_special_symbol (abfd, sym)
455 && ! allow_special_symbols)
456 keep = 0;
458 if (keep)
460 if (to != from)
461 memcpy (to, from, size);
462 to += size;
466 return (to - (bfd_byte *) minisyms) / size;
469 /* These globals are used to pass information into the sorting
470 routines. */
471 static bfd *sort_bfd;
472 static bfd_boolean sort_dynamic;
473 static asymbol *sort_x;
474 static asymbol *sort_y;
476 /* Symbol-sorting predicates */
477 #define valueof(x) ((x)->section->vma + (x)->value)
479 /* Numeric sorts. Undefined symbols are always considered "less than"
480 defined symbols with zero values. Common symbols are not treated
481 specially -- i.e., their sizes are used as their "values". */
483 static int
484 non_numeric_forward (const void *P_x, const void *P_y)
486 asymbol *x, *y;
487 const char *xn, *yn;
489 x = bfd_minisymbol_to_symbol (sort_bfd, sort_dynamic, P_x, sort_x);
490 y = bfd_minisymbol_to_symbol (sort_bfd, sort_dynamic, P_y, sort_y);
491 if (x == NULL || y == NULL)
492 bfd_fatal (bfd_get_filename (sort_bfd));
494 xn = bfd_asymbol_name (x);
495 yn = bfd_asymbol_name (y);
497 if (yn == NULL)
498 return xn != NULL;
499 if (xn == NULL)
500 return -1;
502 #ifdef HAVE_STRCOLL
503 /* Solaris 2.5 has a bug in strcoll.
504 strcoll returns invalid values when confronted with empty strings. */
505 if (*yn == '\0')
506 return *xn != '\0';
507 if (*xn == '\0')
508 return -1;
510 return strcoll (xn, yn);
511 #else
512 return strcmp (xn, yn);
513 #endif
516 static int
517 non_numeric_reverse (const void *x, const void *y)
519 return - non_numeric_forward (x, y);
522 static int
523 numeric_forward (const void *P_x, const void *P_y)
525 asymbol *x, *y;
526 asection *xs, *ys;
528 x = bfd_minisymbol_to_symbol (sort_bfd, sort_dynamic, P_x, sort_x);
529 y = bfd_minisymbol_to_symbol (sort_bfd, sort_dynamic, P_y, sort_y);
530 if (x == NULL || y == NULL)
531 bfd_fatal (bfd_get_filename (sort_bfd));
533 xs = bfd_get_section (x);
534 ys = bfd_get_section (y);
536 if (bfd_is_und_section (xs))
538 if (! bfd_is_und_section (ys))
539 return -1;
541 else if (bfd_is_und_section (ys))
542 return 1;
543 else if (valueof (x) != valueof (y))
544 return valueof (x) < valueof (y) ? -1 : 1;
546 return non_numeric_forward (P_x, P_y);
549 static int
550 numeric_reverse (const void *x, const void *y)
552 return - numeric_forward (x, y);
555 static int (*(sorters[2][2])) (const void *, const void *) =
557 { non_numeric_forward, non_numeric_reverse },
558 { numeric_forward, numeric_reverse }
561 /* This sort routine is used by sort_symbols_by_size. It is similar
562 to numeric_forward, but when symbols have the same value it sorts
563 by section VMA. This simplifies the sort_symbols_by_size code
564 which handles symbols at the end of sections. Also, this routine
565 tries to sort file names before other symbols with the same value.
566 That will make the file name have a zero size, which will make
567 sort_symbols_by_size choose the non file name symbol, leading to
568 more meaningful output. For similar reasons, this code sorts
569 gnu_compiled_* and gcc2_compiled before other symbols with the same
570 value. */
572 static int
573 size_forward1 (const void *P_x, const void *P_y)
575 asymbol *x, *y;
576 asection *xs, *ys;
577 const char *xn, *yn;
578 size_t xnl, ynl;
579 int xf, yf;
581 x = bfd_minisymbol_to_symbol (sort_bfd, sort_dynamic, P_x, sort_x);
582 y = bfd_minisymbol_to_symbol (sort_bfd, sort_dynamic, P_y, sort_y);
583 if (x == NULL || y == NULL)
584 bfd_fatal (bfd_get_filename (sort_bfd));
586 xs = bfd_get_section (x);
587 ys = bfd_get_section (y);
589 if (bfd_is_und_section (xs))
590 abort ();
591 if (bfd_is_und_section (ys))
592 abort ();
594 if (valueof (x) != valueof (y))
595 return valueof (x) < valueof (y) ? -1 : 1;
597 if (xs->vma != ys->vma)
598 return xs->vma < ys->vma ? -1 : 1;
600 xn = bfd_asymbol_name (x);
601 yn = bfd_asymbol_name (y);
602 xnl = strlen (xn);
603 ynl = strlen (yn);
605 /* The symbols gnu_compiled and gcc2_compiled convey even less
606 information than the file name, so sort them out first. */
608 xf = (strstr (xn, "gnu_compiled") != NULL
609 || strstr (xn, "gcc2_compiled") != NULL);
610 yf = (strstr (yn, "gnu_compiled") != NULL
611 || strstr (yn, "gcc2_compiled") != NULL);
613 if (xf && ! yf)
614 return -1;
615 if (! xf && yf)
616 return 1;
618 /* We use a heuristic for the file name. It may not work on non
619 Unix systems, but it doesn't really matter; the only difference
620 is precisely which symbol names get printed. */
622 #define file_symbol(s, sn, snl) \
623 (((s)->flags & BSF_FILE) != 0 \
624 || ((sn)[(snl) - 2] == '.' \
625 && ((sn)[(snl) - 1] == 'o' \
626 || (sn)[(snl) - 1] == 'a')))
628 xf = file_symbol (x, xn, xnl);
629 yf = file_symbol (y, yn, ynl);
631 if (xf && ! yf)
632 return -1;
633 if (! xf && yf)
634 return 1;
636 return non_numeric_forward (P_x, P_y);
639 /* This sort routine is used by sort_symbols_by_size. It is sorting
640 an array of size_sym structures into size order. */
642 static int
643 size_forward2 (const void *P_x, const void *P_y)
645 const struct size_sym *x = (const struct size_sym *) P_x;
646 const struct size_sym *y = (const struct size_sym *) P_y;
648 if (x->size < y->size)
649 return reverse_sort ? 1 : -1;
650 else if (x->size > y->size)
651 return reverse_sort ? -1 : 1;
652 else
653 return sorters[0][reverse_sort] (x->minisym, y->minisym);
656 /* Sort the symbols by size. ELF provides a size but for other formats
657 we have to make a guess by assuming that the difference between the
658 address of a symbol and the address of the next higher symbol is the
659 size. */
661 static long
662 sort_symbols_by_size (bfd *abfd, bfd_boolean is_dynamic, void *minisyms,
663 long symcount, unsigned int size,
664 struct size_sym **symsizesp)
666 struct size_sym *symsizes;
667 bfd_byte *from, *fromend;
668 asymbol *sym = NULL;
669 asymbol *store_sym, *store_next;
671 qsort (minisyms, symcount, size, size_forward1);
673 /* We are going to return a special set of symbols and sizes to
674 print. */
675 symsizes = (struct size_sym *) xmalloc (symcount * sizeof (struct size_sym));
676 *symsizesp = symsizes;
678 /* Note that filter_symbols has already removed all absolute and
679 undefined symbols. Here we remove all symbols whose size winds
680 up as zero. */
681 from = (bfd_byte *) minisyms;
682 fromend = from + symcount * size;
684 store_sym = sort_x;
685 store_next = sort_y;
687 if (from < fromend)
689 sym = bfd_minisymbol_to_symbol (abfd, is_dynamic, (const void *) from,
690 store_sym);
691 if (sym == NULL)
692 bfd_fatal (bfd_get_filename (abfd));
695 for (; from < fromend; from += size)
697 asymbol *next;
698 asection *sec;
699 bfd_vma sz;
700 asymbol *temp;
702 if (from + size < fromend)
704 next = bfd_minisymbol_to_symbol (abfd,
705 is_dynamic,
706 (const void *) (from + size),
707 store_next);
708 if (next == NULL)
709 bfd_fatal (bfd_get_filename (abfd));
711 else
712 next = NULL;
714 sec = bfd_get_section (sym);
716 if (bfd_get_flavour (abfd) == bfd_target_elf_flavour)
717 sz = ((elf_symbol_type *) sym)->internal_elf_sym.st_size;
718 else if (bfd_is_com_section (sec))
719 sz = sym->value;
720 else
722 if (from + size < fromend
723 && sec == bfd_get_section (next))
724 sz = valueof (next) - valueof (sym);
725 else
726 sz = (bfd_get_section_vma (abfd, sec)
727 + bfd_section_size (abfd, sec)
728 - valueof (sym));
731 if (sz != 0)
733 symsizes->minisym = (const void *) from;
734 symsizes->size = sz;
735 ++symsizes;
738 sym = next;
740 temp = store_sym;
741 store_sym = store_next;
742 store_next = temp;
745 symcount = symsizes - *symsizesp;
747 /* We must now sort again by size. */
748 qsort ((void *) *symsizesp, symcount, sizeof (struct size_sym), size_forward2);
750 return symcount;
753 /* This function is used to get the relocs for a particular section.
754 It is called via bfd_map_over_sections. */
756 static void
757 get_relocs (bfd *abfd, asection *sec, void *dataarg)
759 struct get_relocs_info *data = (struct get_relocs_info *) dataarg;
761 *data->secs = sec;
763 if ((sec->flags & SEC_RELOC) == 0)
765 *data->relocs = NULL;
766 *data->relcount = 0;
768 else
770 long relsize;
772 relsize = bfd_get_reloc_upper_bound (abfd, sec);
773 if (relsize < 0)
774 bfd_fatal (bfd_get_filename (abfd));
776 *data->relocs = (arelent **) xmalloc (relsize);
777 *data->relcount = bfd_canonicalize_reloc (abfd, sec, *data->relocs,
778 data->syms);
779 if (*data->relcount < 0)
780 bfd_fatal (bfd_get_filename (abfd));
783 ++data->secs;
784 ++data->relocs;
785 ++data->relcount;
788 /* Print a single symbol. */
790 static void
791 print_symbol (bfd *abfd, asymbol *sym, bfd_vma ssize, bfd *archive_bfd)
793 symbol_info syminfo;
794 struct extended_symbol_info info;
796 PROGRESS (1);
798 format->print_symbol_filename (archive_bfd, abfd);
800 bfd_get_symbol_info (abfd, sym, &syminfo);
801 info.sinfo = &syminfo;
802 info.ssize = ssize;
803 if (bfd_get_flavour (abfd) == bfd_target_elf_flavour)
804 info.elfinfo = (elf_symbol_type *) sym;
805 else
806 info.elfinfo = NULL;
807 format->print_symbol_info (&info, abfd);
809 if (line_numbers)
811 static asymbol **syms;
812 static long symcount;
813 const char *filename, *functionname;
814 unsigned int lineno;
816 /* We need to get the canonical symbols in order to call
817 bfd_find_nearest_line. This is inefficient, but, then, you
818 don't have to use --line-numbers. */
819 if (abfd != lineno_cache_bfd && syms != NULL)
821 free (syms);
822 syms = NULL;
824 if (syms == NULL)
826 long symsize;
828 symsize = bfd_get_symtab_upper_bound (abfd);
829 if (symsize < 0)
830 bfd_fatal (bfd_get_filename (abfd));
831 syms = (asymbol **) xmalloc (symsize);
832 symcount = bfd_canonicalize_symtab (abfd, syms);
833 if (symcount < 0)
834 bfd_fatal (bfd_get_filename (abfd));
835 lineno_cache_bfd = abfd;
838 if (bfd_is_und_section (bfd_get_section (sym)))
840 static asection **secs;
841 static arelent ***relocs;
842 static long *relcount;
843 static unsigned int seccount;
844 unsigned int i;
845 const char *symname;
847 /* For an undefined symbol, we try to find a reloc for the
848 symbol, and print the line number of the reloc. */
849 if (abfd != lineno_cache_rel_bfd && relocs != NULL)
851 for (i = 0; i < seccount; i++)
852 if (relocs[i] != NULL)
853 free (relocs[i]);
854 free (secs);
855 free (relocs);
856 free (relcount);
857 secs = NULL;
858 relocs = NULL;
859 relcount = NULL;
862 if (relocs == NULL)
864 struct get_relocs_info rinfo;
866 seccount = bfd_count_sections (abfd);
868 secs = (asection **) xmalloc (seccount * sizeof *secs);
869 relocs = (arelent ***) xmalloc (seccount * sizeof *relocs);
870 relcount = (long *) xmalloc (seccount * sizeof *relcount);
872 rinfo.secs = secs;
873 rinfo.relocs = relocs;
874 rinfo.relcount = relcount;
875 rinfo.syms = syms;
876 bfd_map_over_sections (abfd, get_relocs, (void *) &rinfo);
877 lineno_cache_rel_bfd = abfd;
880 symname = bfd_asymbol_name (sym);
881 for (i = 0; i < seccount; i++)
883 long j;
885 for (j = 0; j < relcount[i]; j++)
887 arelent *r;
889 r = relocs[i][j];
890 if (r->sym_ptr_ptr != NULL
891 && (*r->sym_ptr_ptr)->section == sym->section
892 && (*r->sym_ptr_ptr)->value == sym->value
893 && strcmp (symname,
894 bfd_asymbol_name (*r->sym_ptr_ptr)) == 0
895 && bfd_find_nearest_line (abfd, secs[i], syms,
896 r->address, &filename,
897 &functionname, &lineno)
898 && filename != NULL)
900 /* We only print the first one we find. */
901 printf ("\t%s:%u", filename, lineno);
902 i = seccount;
903 break;
908 else if (bfd_get_section (sym)->owner == abfd)
910 if ((bfd_find_line (abfd, syms, sym, &filename, &lineno)
911 || bfd_find_nearest_line (abfd, bfd_get_section (sym),
912 syms, sym->value, &filename,
913 &functionname, &lineno))
914 && filename != NULL
915 && lineno != 0)
916 printf ("\t%s:%u", filename, lineno);
920 putchar ('\n');
923 /* Print the symbols when sorting by size. */
925 static void
926 print_size_symbols (bfd *abfd, bfd_boolean is_dynamic,
927 struct size_sym *symsizes, long symcount,
928 bfd *archive_bfd)
930 asymbol *store;
931 struct size_sym *from, *fromend;
933 store = bfd_make_empty_symbol (abfd);
934 if (store == NULL)
935 bfd_fatal (bfd_get_filename (abfd));
937 from = symsizes;
938 fromend = from + symcount;
939 for (; from < fromend; from++)
941 asymbol *sym;
942 bfd_vma ssize;
944 sym = bfd_minisymbol_to_symbol (abfd, is_dynamic, from->minisym, store);
945 if (sym == NULL)
946 bfd_fatal (bfd_get_filename (abfd));
948 /* For elf we have already computed the correct symbol size. */
949 if (bfd_get_flavour (abfd) == bfd_target_elf_flavour)
950 ssize = from->size;
951 else
952 ssize = from->size - bfd_section_vma (abfd, bfd_get_section (sym));
954 print_symbol (abfd, sym, ssize, archive_bfd);
959 /* Print the symbols. If ARCHIVE_BFD is non-NULL, it is the archive
960 containing ABFD. */
962 static void
963 print_symbols (bfd *abfd, bfd_boolean is_dynamic, void *minisyms, long symcount,
964 unsigned int size, bfd *archive_bfd)
966 asymbol *store;
967 bfd_byte *from, *fromend;
969 store = bfd_make_empty_symbol (abfd);
970 if (store == NULL)
971 bfd_fatal (bfd_get_filename (abfd));
973 from = (bfd_byte *) minisyms;
974 fromend = from + symcount * size;
975 for (; from < fromend; from += size)
977 asymbol *sym;
979 sym = bfd_minisymbol_to_symbol (abfd, is_dynamic, from, store);
980 if (sym == NULL)
981 bfd_fatal (bfd_get_filename (abfd));
983 print_symbol (abfd, sym, (bfd_vma) 0, archive_bfd);
987 /* If ARCHIVE_BFD is non-NULL, it is the archive containing ABFD. */
989 static void
990 display_rel_file (bfd *abfd, bfd *archive_bfd)
992 long symcount;
993 void *minisyms;
994 unsigned int size;
995 struct size_sym *symsizes;
997 if (! dynamic)
999 if (!(bfd_get_file_flags (abfd) & HAS_SYMS))
1001 non_fatal (_("%s: no symbols"), bfd_get_filename (abfd));
1002 return;
1006 symcount = bfd_read_minisymbols (abfd, dynamic, &minisyms, &size);
1007 if (symcount < 0)
1008 bfd_fatal (bfd_get_filename (abfd));
1010 if (symcount == 0)
1012 non_fatal (_("%s: no symbols"), bfd_get_filename (abfd));
1013 return;
1016 if (show_synthetic && size == sizeof (asymbol *))
1018 asymbol *synthsyms;
1019 long synth_count;
1020 asymbol **static_syms = NULL;
1021 asymbol **dyn_syms = NULL;
1022 long static_count = 0;
1023 long dyn_count = 0;
1025 if (dynamic)
1027 dyn_count = symcount;
1028 dyn_syms = (asymbol **) minisyms;
1030 else
1032 long storage = bfd_get_dynamic_symtab_upper_bound (abfd);
1034 static_count = symcount;
1035 static_syms = (asymbol **) minisyms;
1037 if (storage > 0)
1039 dyn_syms = (asymbol **) xmalloc (storage);
1040 dyn_count = bfd_canonicalize_dynamic_symtab (abfd, dyn_syms);
1041 if (dyn_count < 0)
1042 bfd_fatal (bfd_get_filename (abfd));
1045 synth_count = bfd_get_synthetic_symtab (abfd, static_count, static_syms,
1046 dyn_count, dyn_syms, &synthsyms);
1047 if (synth_count > 0)
1049 asymbol **symp;
1050 void *new_mini;
1051 long i;
1053 new_mini = xmalloc ((symcount + synth_count + 1) * sizeof (*symp));
1054 symp = (asymbol **) new_mini;
1055 memcpy (symp, minisyms, symcount * sizeof (*symp));
1056 symp += symcount;
1057 for (i = 0; i < synth_count; i++)
1058 *symp++ = synthsyms + i;
1059 *symp = 0;
1060 minisyms = new_mini;
1061 symcount += synth_count;
1065 /* Discard the symbols we don't want to print.
1066 It's OK to do this in place; we'll free the storage anyway
1067 (after printing). */
1069 symcount = filter_symbols (abfd, dynamic, minisyms, symcount, size);
1071 symsizes = NULL;
1072 if (! no_sort)
1074 sort_bfd = abfd;
1075 sort_dynamic = dynamic;
1076 sort_x = bfd_make_empty_symbol (abfd);
1077 sort_y = bfd_make_empty_symbol (abfd);
1078 if (sort_x == NULL || sort_y == NULL)
1079 bfd_fatal (bfd_get_filename (abfd));
1081 if (! sort_by_size)
1082 qsort (minisyms, symcount, size,
1083 sorters[sort_numerically][reverse_sort]);
1084 else
1085 symcount = sort_symbols_by_size (abfd, dynamic, minisyms, symcount,
1086 size, &symsizes);
1089 if (! sort_by_size)
1090 print_symbols (abfd, dynamic, minisyms, symcount, size, archive_bfd);
1091 else
1092 print_size_symbols (abfd, dynamic, symsizes, symcount, archive_bfd);
1094 free (minisyms);
1097 static void
1098 set_print_width (bfd *file)
1100 print_width = bfd_get_arch_size (file);
1102 if (print_width == -1)
1104 /* PR binutils/4292
1105 Guess the target's bitsize based on its name.
1106 We assume here than any 64-bit format will include
1107 "64" somewhere in its name. The only known exception
1108 is the MMO object file format. */
1109 if (strstr (bfd_get_target (file), "64") != NULL
1110 || strcmp (bfd_get_target (file), "mmo") == 0)
1111 print_width = 64;
1112 else
1113 print_width = 32;
1117 static void
1118 display_archive (bfd *file)
1120 bfd *arfile = NULL;
1121 bfd *last_arfile = NULL;
1122 char **matching;
1124 format->print_archive_filename (bfd_get_filename (file));
1126 if (print_armap)
1127 print_symdef_entry (file);
1129 for (;;)
1131 PROGRESS (1);
1133 arfile = bfd_openr_next_archived_file (file, arfile);
1135 if (arfile == NULL)
1137 if (bfd_get_error () != bfd_error_no_more_archived_files)
1138 bfd_fatal (bfd_get_filename (file));
1139 break;
1142 if (bfd_check_format_matches (arfile, bfd_object, &matching))
1144 set_print_width (arfile);
1145 format->print_archive_member (bfd_get_filename (file),
1146 bfd_get_filename (arfile));
1147 display_rel_file (arfile, file);
1149 else
1151 bfd_nonfatal (bfd_get_filename (arfile));
1152 if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
1154 list_matching_formats (matching);
1155 free (matching);
1159 if (last_arfile != NULL)
1161 bfd_close (last_arfile);
1162 lineno_cache_bfd = NULL;
1163 lineno_cache_rel_bfd = NULL;
1165 last_arfile = arfile;
1168 if (last_arfile != NULL)
1170 bfd_close (last_arfile);
1171 lineno_cache_bfd = NULL;
1172 lineno_cache_rel_bfd = NULL;
1176 static bfd_boolean
1177 display_file (char *filename)
1179 bfd_boolean retval = TRUE;
1180 bfd *file;
1181 char **matching;
1183 if (get_file_size (filename) < 1)
1184 return FALSE;
1186 file = bfd_openr (filename, target);
1187 if (file == NULL)
1189 bfd_nonfatal (filename);
1190 return FALSE;
1193 if (bfd_check_format (file, bfd_archive))
1195 display_archive (file);
1197 else if (bfd_check_format_matches (file, bfd_object, &matching))
1199 set_print_width (file);
1200 format->print_object_filename (filename);
1201 display_rel_file (file, NULL);
1203 else
1205 bfd_nonfatal (filename);
1206 if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
1208 list_matching_formats (matching);
1209 free (matching);
1211 retval = FALSE;
1214 if (!bfd_close (file))
1215 bfd_fatal (filename);
1217 lineno_cache_bfd = NULL;
1218 lineno_cache_rel_bfd = NULL;
1220 return retval;
1223 /* The following 3 groups of functions are called unconditionally,
1224 once at the start of processing each file of the appropriate type.
1225 They should check `filename_per_file' and `filename_per_symbol',
1226 as appropriate for their output format, to determine whether to
1227 print anything. */
1229 /* Print the name of an object file given on the command line. */
1231 static void
1232 print_object_filename_bsd (char *filename)
1234 if (filename_per_file && !filename_per_symbol)
1235 printf ("\n%s:\n", filename);
1238 static void
1239 print_object_filename_sysv (char *filename)
1241 if (undefined_only)
1242 printf (_("\n\nUndefined symbols from %s:\n\n"), filename);
1243 else
1244 printf (_("\n\nSymbols from %s:\n\n"), filename);
1245 if (print_width == 32)
1246 printf (_("\
1247 Name Value Class Type Size Line Section\n\n"));
1248 else
1249 printf (_("\
1250 Name Value Class Type Size Line Section\n\n"));
1253 static void
1254 print_object_filename_posix (char *filename)
1256 if (filename_per_file && !filename_per_symbol)
1257 printf ("%s:\n", filename);
1260 /* Print the name of an archive file given on the command line. */
1262 static void
1263 print_archive_filename_bsd (char *filename)
1265 if (filename_per_file)
1266 printf ("\n%s:\n", filename);
1269 static void
1270 print_archive_filename_sysv (char *filename ATTRIBUTE_UNUSED)
1274 static void
1275 print_archive_filename_posix (char *filename ATTRIBUTE_UNUSED)
1279 /* Print the name of an archive member file. */
1281 static void
1282 print_archive_member_bsd (char *archive ATTRIBUTE_UNUSED,
1283 const char *filename)
1285 if (!filename_per_symbol)
1286 printf ("\n%s:\n", filename);
1289 static void
1290 print_archive_member_sysv (char *archive, const char *filename)
1292 if (undefined_only)
1293 printf (_("\n\nUndefined symbols from %s[%s]:\n\n"), archive, filename);
1294 else
1295 printf (_("\n\nSymbols from %s[%s]:\n\n"), archive, filename);
1296 if (print_width == 32)
1297 printf (_("\
1298 Name Value Class Type Size Line Section\n\n"));
1299 else
1300 printf (_("\
1301 Name Value Class Type Size Line Section\n\n"));
1304 static void
1305 print_archive_member_posix (char *archive, const char *filename)
1307 if (!filename_per_symbol)
1308 printf ("%s[%s]:\n", archive, filename);
1311 /* Print the name of the file (and archive, if there is one)
1312 containing a symbol. */
1314 static void
1315 print_symbol_filename_bsd (bfd *archive_bfd, bfd *abfd)
1317 if (filename_per_symbol)
1319 if (archive_bfd)
1320 printf ("%s:", bfd_get_filename (archive_bfd));
1321 printf ("%s:", bfd_get_filename (abfd));
1325 static void
1326 print_symbol_filename_sysv (bfd *archive_bfd, bfd *abfd)
1328 if (filename_per_symbol)
1330 if (archive_bfd)
1331 printf ("%s:", bfd_get_filename (archive_bfd));
1332 printf ("%s:", bfd_get_filename (abfd));
1336 static void
1337 print_symbol_filename_posix (bfd *archive_bfd, bfd *abfd)
1339 if (filename_per_symbol)
1341 if (archive_bfd)
1342 printf ("%s[%s]: ", bfd_get_filename (archive_bfd),
1343 bfd_get_filename (abfd));
1344 else
1345 printf ("%s: ", bfd_get_filename (abfd));
1349 /* Print a symbol value. */
1351 static void
1352 print_value (bfd *abfd ATTRIBUTE_UNUSED, bfd_vma val)
1354 switch (print_width)
1356 case 32:
1357 printf (value_format_32bit, (unsigned long) val);
1358 break;
1360 case 64:
1361 #if BFD_HOST_64BIT_LONG || BFD_HOST_64BIT_LONG_LONG
1362 printf (value_format_64bit, val);
1363 #else
1364 /* We have a 64 bit value to print, but the host is only 32 bit. */
1365 if (print_radix == 16)
1366 bfd_fprintf_vma (abfd, stdout, val);
1367 else
1369 char buf[30];
1370 char *s;
1372 s = buf + sizeof buf;
1373 *--s = '\0';
1374 while (val > 0)
1376 *--s = (val % print_radix) + '0';
1377 val /= print_radix;
1379 while ((buf + sizeof buf - 1) - s < 16)
1380 *--s = '0';
1381 printf ("%s", s);
1383 #endif
1384 break;
1386 default:
1387 fatal (_("Print width has not been initialized (%d)"), print_width);
1388 break;
1392 /* Print a line of information about a symbol. */
1394 static void
1395 print_symbol_info_bsd (struct extended_symbol_info *info, bfd *abfd)
1397 if (bfd_is_undefined_symclass (SYM_TYPE (info)))
1399 if (print_width == 64)
1400 printf (" ");
1401 printf (" ");
1403 else
1405 /* Normally we print the value of the symbol. If we are printing the
1406 size or sorting by size then we print its size, except for the
1407 (weird) special case where both flags are defined, in which case we
1408 print both values. This conforms to documented behaviour. */
1409 if (sort_by_size && !print_size)
1410 print_value (abfd, SYM_SIZE (info));
1411 else
1412 print_value (abfd, SYM_VALUE (info));
1414 if (print_size && SYM_SIZE (info))
1416 printf (" ");
1417 print_value (abfd, SYM_SIZE (info));
1421 printf (" %c", SYM_TYPE (info));
1423 if (SYM_TYPE (info) == '-')
1425 /* A stab. */
1426 printf (" ");
1427 printf (other_format, SYM_STAB_OTHER (info));
1428 printf (" ");
1429 printf (desc_format, SYM_STAB_DESC (info));
1430 printf (" %5s", SYM_STAB_NAME (info));
1432 print_symname (" %s", SYM_NAME (info), abfd);
1435 static void
1436 print_symbol_info_sysv (struct extended_symbol_info *info, bfd *abfd)
1438 print_symname ("%-20s|", SYM_NAME (info), abfd);
1440 if (bfd_is_undefined_symclass (SYM_TYPE (info)))
1442 if (print_width == 32)
1443 printf (" ");
1444 else
1445 printf (" ");
1447 else
1448 print_value (abfd, SYM_VALUE (info));
1450 printf ("| %c |", SYM_TYPE (info));
1452 if (SYM_TYPE (info) == '-')
1454 /* A stab. */
1455 printf ("%18s| ", SYM_STAB_NAME (info)); /* (C) Type. */
1456 printf (desc_format, SYM_STAB_DESC (info)); /* Size. */
1457 printf ("| |"); /* Line, Section. */
1459 else
1461 /* Type, Size, Line, Section */
1462 if (info->elfinfo)
1463 printf ("%18s|",
1464 get_symbol_type (ELF_ST_TYPE (info->elfinfo->internal_elf_sym.st_info)));
1465 else
1466 printf (" |");
1468 if (SYM_SIZE (info))
1469 print_value (abfd, SYM_SIZE (info));
1470 else
1472 if (print_width == 32)
1473 printf (" ");
1474 else
1475 printf (" ");
1478 if (info->elfinfo)
1479 printf("| |%s", info->elfinfo->symbol.section->name);
1480 else
1481 printf("| |");
1485 static void
1486 print_symbol_info_posix (struct extended_symbol_info *info, bfd *abfd)
1488 print_symname ("%s ", SYM_NAME (info), abfd);
1489 printf ("%c ", SYM_TYPE (info));
1491 if (bfd_is_undefined_symclass (SYM_TYPE (info)))
1492 printf (" ");
1493 else
1495 print_value (abfd, SYM_VALUE (info));
1496 printf (" ");
1497 if (SYM_SIZE (info))
1498 print_value (abfd, SYM_SIZE (info));
1503 main (int argc, char **argv)
1505 int c;
1506 int retval;
1508 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
1509 setlocale (LC_MESSAGES, "");
1510 #endif
1511 #if defined (HAVE_SETLOCALE)
1512 setlocale (LC_CTYPE, "");
1513 setlocale (LC_COLLATE, "");
1514 #endif
1515 bindtextdomain (PACKAGE, LOCALEDIR);
1516 textdomain (PACKAGE);
1518 program_name = *argv;
1519 xmalloc_set_program_name (program_name);
1520 #if BFD_SUPPORTS_PLUGINS
1521 bfd_plugin_set_program_name (program_name);
1522 #endif
1524 START_PROGRESS (program_name, 0);
1526 expandargv (&argc, &argv);
1528 bfd_init ();
1529 set_default_bfd_target ();
1531 while ((c = getopt_long (argc, argv, "aABCDef:gHhlnopPrSst:uvVvX:",
1532 long_options, (int *) 0)) != EOF)
1534 switch (c)
1536 case 'a':
1537 print_debug_syms = 1;
1538 break;
1539 case 'A':
1540 case 'o':
1541 filename_per_symbol = 1;
1542 break;
1543 case 'B': /* For MIPS compatibility. */
1544 set_output_format ("bsd");
1545 break;
1546 case 'C':
1547 do_demangle = 1;
1548 if (optarg != NULL)
1550 enum demangling_styles style;
1552 style = cplus_demangle_name_to_style (optarg);
1553 if (style == unknown_demangling)
1554 fatal (_("unknown demangling style `%s'"),
1555 optarg);
1557 cplus_demangle_set_style (style);
1559 break;
1560 case 'D':
1561 dynamic = 1;
1562 break;
1563 case 'e':
1564 /* Ignored for HP/UX compatibility. */
1565 break;
1566 case 'f':
1567 set_output_format (optarg);
1568 break;
1569 case 'g':
1570 external_only = 1;
1571 break;
1572 case 'H':
1573 case 'h':
1574 usage (stdout, 0);
1575 case 'l':
1576 line_numbers = 1;
1577 break;
1578 case 'n':
1579 case 'v':
1580 sort_numerically = 1;
1581 break;
1582 case 'p':
1583 no_sort = 1;
1584 break;
1585 case 'P':
1586 set_output_format ("posix");
1587 break;
1588 case 'r':
1589 reverse_sort = 1;
1590 break;
1591 case 's':
1592 print_armap = 1;
1593 break;
1594 case 'S':
1595 print_size = 1;
1596 break;
1597 case 't':
1598 set_print_radix (optarg);
1599 break;
1600 case 'u':
1601 undefined_only = 1;
1602 break;
1603 case 'V':
1604 show_version = 1;
1605 break;
1606 case 'X':
1607 /* Ignored for (partial) AIX compatibility. On AIX, the
1608 argument has values 32, 64, or 32_64, and specifies that
1609 only 32-bit, only 64-bit, or both kinds of objects should
1610 be examined. The default is 32. So plain AIX nm on a
1611 library archive with both kinds of objects will ignore
1612 the 64-bit ones. For GNU nm, the default is and always
1613 has been -X 32_64, and other options are not supported. */
1614 if (strcmp (optarg, "32_64") != 0)
1615 fatal (_("Only -X 32_64 is supported"));
1616 break;
1618 case OPTION_TARGET: /* --target */
1619 target = optarg;
1620 break;
1622 case OPTION_PLUGIN: /* --plugin */
1623 #if BFD_SUPPORTS_PLUGINS
1624 bfd_plugin_set_plugin (optarg);
1625 #else
1626 fatal (_("sorry - this program has been built without plugin support\n"));
1627 #endif
1628 break;
1630 case 0: /* A long option that just sets a flag. */
1631 break;
1633 default:
1634 usage (stderr, 1);
1638 if (show_version)
1639 print_version ("nm");
1641 if (sort_by_size && undefined_only)
1643 non_fatal (_("Using the --size-sort and --undefined-only options together"));
1644 non_fatal (_("will produce no output, since undefined symbols have no size."));
1645 return 0;
1648 /* OK, all options now parsed. If no filename specified, do a.out. */
1649 if (optind == argc)
1650 return !display_file ("a.out");
1652 retval = 0;
1654 if (argc - optind > 1)
1655 filename_per_file = 1;
1657 /* We were given several filenames to do. */
1658 while (optind < argc)
1660 PROGRESS (1);
1661 if (!display_file (argv[optind++]))
1662 retval++;
1665 END_PROGRESS (program_name);
1667 #ifdef HAVE_SBRK
1668 if (show_stats)
1670 char *lim = (char *) sbrk (0);
1672 non_fatal (_("data size %ld"), (long) (lim - (char *) &environ));
1674 #endif
1676 exit (retval);
1677 return retval;