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