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