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