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