[ARM]: Modify assembler to accept floating and signless datatypes for MVE instruction...
[deliverable/binutils-gdb.git] / binutils / nm.c
CommitLineData
252b5132 1/* nm.c -- Describe symbol table of a rel file.
82704155 2 Copyright (C) 1991-2019 Free Software Foundation, Inc.
252b5132
RH
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
32866df7 8 the Free Software Foundation; either version 3 of the License, or
252b5132
RH
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
b43b5d5f
NC
18 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
19 02110-1301, USA. */
252b5132 20
3db64b00 21#include "sysdep.h"
252b5132
RH
22#include "bfd.h"
23#include "progress.h"
252b5132
RH
24#include "getopt.h"
25#include "aout/stab_gnu.h"
26#include "aout/ranlib.h"
27#include "demangle.h"
28#include "libiberty.h"
6ab6b380 29#include "elf-bfd.h"
33f5f537 30#include "elf/common.h"
552e55ed
JB
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"
3db64b00 38#include "bucomm.h"
7d0b9ebc 39#include "plugin-api.h"
ce3c775b 40#include "plugin.h"
252b5132
RH
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{
2da42df6 47 const void *minisym;
252b5132
RH
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
9710509e 62struct extended_symbol_info
977f7911
NC
63{
64 symbol_info *sinfo;
65 bfd_vma ssize;
33f5f537 66 elf_symbol_type *elfinfo;
552e55ed 67 coff_symbol_type *coffinfo;
977f7911
NC
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)
33f5f537
L
76#define SYM_SIZE(sym) \
77 (sym->elfinfo ? sym->elfinfo->internal_elf_sym.st_size: sym->ssize)
977f7911 78
252b5132 79/* The output formatting functions. */
b16c44de
AM
80static void print_object_filename_bsd (const char *);
81static void print_object_filename_sysv (const char *);
82static void print_object_filename_posix (const char *);
83static void print_archive_filename_bsd (const char *);
84static void print_archive_filename_sysv (const char *);
85static void print_archive_filename_posix (const char *);
86static void print_archive_member_bsd (const char *, const char *);
87static void print_archive_member_sysv (const char *, const char *);
88static void print_archive_member_posix (const char *, const char *);
2da42df6
AJ
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 *);
252b5132
RH
96
97/* Support for different output formats. */
98struct output_fns
99 {
100 /* Print the name of an object file given on the command line. */
b16c44de 101 void (*print_object_filename) (const char *);
252b5132
RH
102
103 /* Print the name of an archive file given on the command line. */
b16c44de 104 void (*print_archive_filename) (const char *);
252b5132
RH
105
106 /* Print the name of an archive member file. */
b16c44de 107 void (*print_archive_member) (const char *, const char *);
252b5132
RH
108
109 /* Print the name of the file (and archive, if there is one)
110 containing a symbol. */
2da42df6 111 void (*print_symbol_filename) (bfd *, bfd *);
252b5132
RH
112
113 /* Print a line of information about a symbol. */
2da42df6 114 void (*print_symbol_info) (struct extended_symbol_info *, bfd *);
252b5132 115 };
977f7911 116
252b5132
RH
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];
25a02744 144static unsigned int print_format = FORMAT_DEFAULT;
252b5132 145
252b5132
RH
146/* Command options. */
147
148static int do_demangle = 0; /* Pretty print C++ symbol names. */
977f7911
NC
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. */
72797995 154static int print_size = 0; /* Print size of defined symbols. */
977f7911
NC
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. */
0873df2a 161static int show_synthetic = 0; /* Display synthesized symbols too. */
977f7911 162static int line_numbers = 0; /* Print line numbers for symbols. */
3c9458e9 163static int allow_special_symbols = 0; /* Allow special symbols. */
df2c87b5 164static int with_symbol_versions = 0; /* Include symbol version information in the output. */
252b5132 165
af03af8f
NC
166static int demangle_flags = DMGL_ANSI | DMGL_PARAMS;
167
252b5132
RH
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
970ccc77 172static int print_width = 0;
252b5132
RH
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;
92b1b678
MT
179#if BFD_SUPPORTS_PLUGINS
180static const char *plugin_target = "plugin";
181#else
182static const char *plugin_target = NULL;
183#endif
252b5132
RH
184
185/* Used to cache the line numbers for a BFD. */
186static bfd *lineno_cache_bfd;
187static bfd *lineno_cache_rel_bfd;
188
af03af8f
NC
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};
c20f4f8c 197
252b5132
RH
198static struct option long_options[] =
199{
200 {"debug-syms", no_argument, &print_debug_syms, 1},
28c309a2 201 {"demangle", optional_argument, 0, 'C'},
252b5132
RH
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},
af03af8f
NC
209 {"no-recurse-limit", no_argument, NULL, OPTION_NO_RECURSE_LIMIT},
210 {"no-recursion-limit", no_argument, NULL, OPTION_NO_RECURSE_LIMIT},
ddb1377c
AM
211 {"no-sort", no_argument, 0, 'p'},
212 {"numeric-sort", no_argument, 0, 'n'},
ce3c775b 213 {"plugin", required_argument, 0, OPTION_PLUGIN},
252b5132
RH
214 {"portability", no_argument, 0, 'P'},
215 {"print-armap", no_argument, &print_armap, 1},
216 {"print-file-name", no_argument, 0, 'o'},
72797995 217 {"print-size", no_argument, 0, 'S'},
252b5132 218 {"radix", required_argument, 0, 't'},
af03af8f
NC
219 {"recurse-limit", no_argument, NULL, OPTION_RECURSE_LIMIT},
220 {"recursion-limit", no_argument, NULL, OPTION_RECURSE_LIMIT},
252b5132 221 {"reverse-sort", no_argument, &reverse_sort, 1},
ddb1377c 222 {"size-sort", no_argument, 0, OPTION_SIZE_SORT},
3c9458e9 223 {"special-syms", no_argument, &allow_special_symbols, 1},
0873df2a 224 {"synthetic", no_argument, &show_synthetic, 1},
c20f4f8c 225 {"target", required_argument, 0, OPTION_TARGET},
252b5132
RH
226 {"defined-only", no_argument, &defined_only, 1},
227 {"undefined-only", no_argument, &undefined_only, 1},
228 {"version", no_argument, &show_version, 1},
df2c87b5 229 {"with-symbol-versions", no_argument, &with_symbol_versions, 1},
252b5132
RH
230 {0, no_argument, 0, 0}
231};
232\f
977f7911 233/* Some error-reporting functions. */
252b5132 234
1e0f0b4d 235ATTRIBUTE_NORETURN static void
2da42df6 236usage (FILE *stream, int status)
252b5132 237{
8b53311e
NC
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\
b56f55ce
NC
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\
28c309a2
NC
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\
f0c8c24a
NC
246 `gnu', `lucid', `arm', `hp', `edg', `gnu-v3', `java'\n\
247 or `gnat'\n\
b56f55ce 248 --no-demangle Do not demangle low-level symbol names\n\
af03af8f
NC
249 --recurse-limit Enable a demangling recursion limit. This is the default.\n\
250 --no-recurse-limit Disable a demangling recursion limit.\n\
b56f55ce
NC
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\
b56f55ce
NC
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\
d46fc8e8 263 -r, --reverse-sort Reverse the sense of the sort\n"));
ce3c775b 264#if BFD_SUPPORTS_PLUGINS
d46fc8e8
NC
265 fprintf (stream, _("\
266 --plugin NAME Load the specified plugin\n"));
ce3c775b 267#endif
d46fc8e8 268 fprintf (stream, _("\
d2ca6b5b 269 -S, --print-size Print size of defined symbols\n\
b56f55ce
NC
270 -s, --print-armap Include index for symbols from archive members\n\
271 --size-sort Sort symbols by size\n\
61bbd35b 272 --special-syms Include special symbols in the output\n\
0873df2a 273 --synthetic Display synthetic symbols as well\n\
b56f55ce
NC
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\
df2c87b5 277 --with-symbol-versions Display version strings after symbol names\n\
6e800839 278 -X 32_64 (ignored)\n\
07012eee 279 @FILE Read options from FILE\n\
8b53311e
NC
280 -h, --help Display this information\n\
281 -V, --version Display this program's version number\n\
b56f55ce 282\n"));
252b5132 283 list_supported_targets (program_name, stream);
92f01d61 284 if (REPORT_BUGS_TO[0] && status == 0)
b56f55ce 285 fprintf (stream, _("Report bugs to %s.\n"), REPORT_BUGS_TO);
252b5132
RH
286 exit (status);
287}
288
289/* Set the radix for the symbol value and size according to RADIX. */
290
291static void
2da42df6 292set_print_radix (char *radix)
252b5132
RH
293{
294 switch (*radix)
295 {
25a02744
NC
296 case 'x': print_radix = 16; break;
297 case 'd': print_radix = 10; break;
298 case 'o': print_radix = 8; break;
299
252b5132 300 default:
37cc8ec1 301 fatal (_("%s: invalid radix"), radix);
252b5132 302 }
25a02744
NC
303
304 other_format[3] = desc_format[3] = *radix;
252b5132
RH
305}
306
307static void
2da42df6 308set_output_format (char *f)
252b5132
RH
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:
37cc8ec1 327 fatal (_("%s: invalid output format"), f);
252b5132
RH
328 }
329 format = &formats[i];
25a02744 330 print_format = i;
252b5132
RH
331}
332\f
33f5f537 333static const char *
552e55ed 334get_elf_symbol_type (unsigned int type)
33f5f537 335{
7358f4cb
AM
336 static char *bufp;
337 int n;
33f5f537
L
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";
33f5f537 348 }
7358f4cb
AM
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;
33f5f537 360}
552e55ed
JB
361
362static const char *
363get_coff_symbol_type (const struct internal_syment *sym)
364{
7358f4cb
AM
365 static char *bufp;
366 int n;
552e55ed
JB
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";
7358f4cb 377
552e55ed
JB
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 }
7358f4cb
AM
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;
552e55ed 390}
382c1116 391\f
91d6fa6a 392/* Print symbol name NAME, read from ABFD, with printf format FORM,
382c1116 393 demangling it if requested. */
33f5f537 394
252b5132 395static void
91d6fa6a 396print_symname (const char *form, const char *name, bfd *abfd)
252b5132 397{
382c1116 398 if (do_demangle && *name)
252b5132 399 {
af03af8f 400 char *res = bfd_demangle (abfd, name, demangle_flags);
ed180cc5
AM
401
402 if (res != NULL)
403 {
91d6fa6a 404 printf (form, res);
ed180cc5
AM
405 free (res);
406 return;
407 }
382c1116 408 }
252b5132 409
91d6fa6a 410 printf (form, name);
382c1116 411}
252b5132 412
382c1116
NC
413static void
414print_symdef_entry (bfd *abfd)
415{
416 symindex idx = BFD_NO_MORE_SYMBOLS;
417 carsym *thesym;
418 bfd_boolean everprinted = FALSE;
33f5f537 419
382c1116
NC
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)
252b5132 426 {
382c1116
NC
427 printf (_("\nArchive index:\n"));
428 everprinted = TRUE;
252b5132 429 }
382c1116
NC
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)
252b5132 434 {
382c1116
NC
435 print_symname ("%s", thesym->name, abfd);
436 printf (" in %s\n", bfd_get_filename (elt));
252b5132 437 }
252b5132
RH
438 }
439}
382c1116 440\f
cc5277b1
ML
441
442/* True when we can report missing plugin error. */
443bfd_boolean report_plugin_err = TRUE;
444
382c1116
NC
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. */
252b5132 448
382c1116 449static long
91d6fa6a 450filter_symbols (bfd *abfd, bfd_boolean is_dynamic, void *minisyms,
382c1116 451 long symcount, unsigned int size)
252b5132 452{
382c1116
NC
453 bfd_byte *from, *fromend, *to;
454 asymbol *store;
252b5132 455
382c1116
NC
456 store = bfd_make_empty_symbol (abfd);
457 if (store == NULL)
458 bfd_fatal (bfd_get_filename (abfd));
f24ddbdd 459
382c1116
NC
460 from = (bfd_byte *) minisyms;
461 fromend = from + symcount * size;
462 to = (bfd_byte *) minisyms;
252b5132 463
382c1116 464 for (; from < fromend; from += size)
252b5132 465 {
382c1116
NC
466 int keep = 0;
467 asymbol *sym;
33f5f537 468
382c1116
NC
469 PROGRESS (1);
470
91d6fa6a 471 sym = bfd_minisymbol_to_symbol (abfd, is_dynamic, (const void *) from, store);
382c1116
NC
472 if (sym == NULL)
473 bfd_fatal (bfd_get_filename (abfd));
474
e601d38b
AM
475 if (sym->name[0] == '_'
476 && sym->name[1] == '_'
cc5277b1
ML
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 }
b794fc1d 484
382c1116
NC
485 if (undefined_only)
486 keep = bfd_is_und_section (sym->section);
487 else if (external_only)
6a1b08f5
L
488 /* PR binutls/12753: Unique symbols are global too. */
489 keep = ((sym->flags & (BSF_GLOBAL
490 | BSF_WEAK
491 | BSF_GNU_UNIQUE)) != 0
382c1116
NC
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)
252b5132 510 {
382c1116
NC
511 if (bfd_is_und_section (sym->section))
512 keep = 0;
252b5132 513 }
252b5132 514
3c9458e9
NC
515 if (keep
516 && bfd_is_target_special_symbol (abfd, sym)
517 && ! allow_special_symbols)
518 keep = 0;
519
382c1116
NC
520 if (keep)
521 {
ede76260
HPN
522 if (to != from)
523 memcpy (to, from, size);
382c1116
NC
524 to += size;
525 }
526 }
252b5132 527
382c1116 528 return (to - (bfd_byte *) minisyms) / size;
252b5132
RH
529}
530\f
531/* These globals are used to pass information into the sorting
532 routines. */
533static bfd *sort_bfd;
b34976b6 534static bfd_boolean sort_dynamic;
252b5132
RH
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
252b5132 545static int
2da42df6 546non_numeric_forward (const void *P_x, const void *P_y)
252b5132
RH
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
9710509e
AM
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
252b5132
RH
576}
577
578static int
2da42df6 579non_numeric_reverse (const void *x, const void *y)
252b5132
RH
580{
581 return - non_numeric_forward (x, y);
582}
583
382c1116
NC
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
e6f7f6d1
AM
595 xs = bfd_asymbol_section (x);
596 ys = bfd_asymbol_section (y);
382c1116
NC
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
2da42df6 617static int (*(sorters[2][2])) (const void *, const void *) =
252b5132
RH
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
2da42df6 635size_forward1 (const void *P_x, const void *P_y)
252b5132
RH
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
e6f7f6d1
AM
648 xs = bfd_asymbol_section (x);
649 ys = bfd_asymbol_section (y);
252b5132
RH
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 \
c1221402
NC
686 || ((snl) > 2 \
687 && (sn)[(snl) - 2] == '.' \
252b5132
RH
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
2da42df6 706size_forward2 (const void *P_x, const void *P_y)
252b5132
RH
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
6ab6b380
NC
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. */
252b5132
RH
723
724static long
91d6fa6a 725sort_symbols_by_size (bfd *abfd, bfd_boolean is_dynamic, void *minisyms,
2da42df6
AJ
726 long symcount, unsigned int size,
727 struct size_sym **symsizesp)
252b5132
RH
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. */
3f5e193b 738 symsizes = (struct size_sym *) xmalloc (symcount * sizeof (struct size_sym));
252b5132
RH
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. */
252b5132
RH
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 {
91d6fa6a 752 sym = bfd_minisymbol_to_symbol (abfd, is_dynamic, (const void *) from,
252b5132
RH
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,
91d6fa6a 768 is_dynamic,
2da42df6 769 (const void *) (from + size),
252b5132
RH
770 store_next);
771 if (next == NULL)
772 bfd_fatal (bfd_get_filename (abfd));
773 }
774 else
775 next = NULL;
776
e6f7f6d1 777 sec = bfd_asymbol_section (sym);
252b5132 778
cec4b2e3 779 /* Synthetic symbols don't have a full type set of data available, thus
160b1a61
AM
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)
6ab6b380 784 sz = ((elf_symbol_type *) sym)->internal_elf_sym.st_size;
160b1a61
AM
785 else if ((sym->flags & (BSF_SECTION_SYM | BSF_SYNTHETIC)) == 0
786 && bfd_is_com_section (sec))
252b5132
RH
787 sz = sym->value;
788 else
789 {
790 if (from + size < fromend
e6f7f6d1 791 && sec == bfd_asymbol_section (next))
252b5132
RH
792 sz = valueof (next) - valueof (sym);
793 else
fd361982
AM
794 sz = (bfd_section_vma (sec)
795 + bfd_section_size (sec)
252b5132
RH
796 - valueof (sym));
797 }
798
799 if (sz != 0)
800 {
2da42df6 801 symsizes->minisym = (const void *) from;
252b5132
RH
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. */
2da42df6 816 qsort ((void *) *symsizesp, symcount, sizeof (struct size_sym), size_forward2);
252b5132
RH
817
818 return symcount;
819}
382c1116
NC
820
821/* This function is used to get the relocs for a particular section.
822 It is called via bfd_map_over_sections. */
252b5132
RH
823
824static void
382c1116 825get_relocs (bfd *abfd, asection *sec, void *dataarg)
252b5132 826{
382c1116 827 struct get_relocs_info *data = (struct get_relocs_info *) dataarg;
252b5132 828
382c1116
NC
829 *data->secs = sec;
830
831 if ((sec->flags & SEC_RELOC) == 0)
252b5132 832 {
382c1116
NC
833 *data->relocs = NULL;
834 *data->relcount = 0;
252b5132 835 }
382c1116
NC
836 else
837 {
838 long relsize;
252b5132 839
382c1116
NC
840 relsize = bfd_get_reloc_upper_bound (abfd, sec);
841 if (relsize < 0)
842 bfd_fatal (bfd_get_filename (abfd));
252b5132 843
3f5e193b 844 *data->relocs = (arelent **) xmalloc (relsize);
382c1116
NC
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));
68a4c073 849 }
252b5132 850
382c1116
NC
851 ++data->secs;
852 ++data->relocs;
853 ++data->relcount;
854}
855
856/* Print a single symbol. */
857
858static void
896ca098
NC
859print_symbol (bfd * abfd,
860 asymbol * sym,
861 bfd_vma ssize,
2387dd90 862 bfd * archive_bfd)
382c1116
NC
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);
896ca098 872
382c1116
NC
873 info.sinfo = &syminfo;
874 info.ssize = ssize;
160b1a61
AM
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)
552e55ed
JB
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 }
896ca098 887
382c1116
NC
888 format->print_symbol_info (&info, abfd);
889
df2c87b5
NC
890 if (with_symbol_versions)
891 {
892 const char * version_string = NULL;
893 bfd_boolean hidden = FALSE;
894
160b1a61 895 if ((sym->flags & (BSF_SECTION_SYM | BSF_SYNTHETIC)) == 0)
df2c87b5
NC
896 version_string = bfd_get_symbol_version_string (abfd, sym, &hidden);
897
e6f7f6d1 898 if (bfd_is_und_section (bfd_asymbol_section (sym)))
df2c87b5
NC
899 hidden = TRUE;
900
901 if (version_string && *version_string != '\0')
902 printf (hidden ? "@%s" : "@@%s", version_string);
903 }
904
382c1116 905 if (line_numbers)
0873df2a 906 {
382c1116
NC
907 static asymbol **syms;
908 static long symcount;
909 const char *filename, *functionname;
910 unsigned int lineno;
0873df2a 911
382c1116
NC
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)
0873df2a 916 {
382c1116
NC
917 free (syms);
918 syms = NULL;
0873df2a 919 }
382c1116 920 if (syms == NULL)
0873df2a 921 {
382c1116
NC
922 long symsize;
923
924 symsize = bfd_get_symtab_upper_bound (abfd);
925 if (symsize < 0)
926 bfd_fatal (bfd_get_filename (abfd));
3f5e193b 927 syms = (asymbol **) xmalloc (symsize);
382c1116
NC
928 symcount = bfd_canonicalize_symtab (abfd, syms);
929 if (symcount < 0)
930 bfd_fatal (bfd_get_filename (abfd));
931 lineno_cache_bfd = abfd;
0873df2a 932 }
0873df2a 933
e6f7f6d1 934 if (bfd_is_und_section (bfd_asymbol_section (sym)))
382c1116
NC
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;
0873df2a 942
382c1116
NC
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 }
252b5132 957
382c1116
NC
958 if (relocs == NULL)
959 {
91d6fa6a 960 struct get_relocs_info rinfo;
252b5132 961
382c1116 962 seccount = bfd_count_sections (abfd);
252b5132 963
3f5e193b
NC
964 secs = (asection **) xmalloc (seccount * sizeof *secs);
965 relocs = (arelent ***) xmalloc (seccount * sizeof *relocs);
966 relcount = (long *) xmalloc (seccount * sizeof *relcount);
252b5132 967
91d6fa6a
NC
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);
382c1116
NC
973 lineno_cache_rel_bfd = abfd;
974 }
252b5132 975
382c1116
NC
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 }
e6f7f6d1 1004 else if (bfd_asymbol_section (sym)->owner == abfd)
382c1116 1005 {
5420f73d 1006 if ((bfd_find_line (abfd, syms, sym, &filename, &lineno)
e6f7f6d1 1007 || bfd_find_nearest_line (abfd, bfd_asymbol_section (sym),
5420f73d
L
1008 syms, sym->value, &filename,
1009 &functionname, &lineno))
382c1116
NC
1010 && filename != NULL
1011 && lineno != 0)
1012 printf ("\t%s:%u", filename, lineno);
1013 }
1014 }
1015
1016 putchar ('\n');
252b5132
RH
1017}
1018\f
382c1116 1019/* Print the symbols when sorting by size. */
252b5132 1020
382c1116 1021static void
896ca098
NC
1022print_size_symbols (bfd * abfd,
1023 bfd_boolean is_dynamic,
1024 struct size_sym * symsizes,
1025 long symcount,
896ca098 1026 bfd * archive_bfd)
252b5132 1027{
252b5132 1028 asymbol *store;
896ca098
NC
1029 struct size_sym *from;
1030 struct size_sym *fromend;
252b5132
RH
1031
1032 store = bfd_make_empty_symbol (abfd);
1033 if (store == NULL)
1034 bfd_fatal (bfd_get_filename (abfd));
1035
382c1116
NC
1036 from = symsizes;
1037 fromend = from + symcount;
896ca098 1038
382c1116 1039 for (; from < fromend; from++)
252b5132 1040 {
252b5132
RH
1041 asymbol *sym;
1042
91d6fa6a 1043 sym = bfd_minisymbol_to_symbol (abfd, is_dynamic, from->minisym, store);
252b5132
RH
1044 if (sym == NULL)
1045 bfd_fatal (bfd_get_filename (abfd));
1046
2387dd90 1047 print_symbol (abfd, sym, from->size, archive_bfd);
252b5132 1048 }
252b5132
RH
1049}
1050
382c1116 1051\f
896ca098
NC
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
2387dd90 1056 SYMCOUNT is the number of symbols in MINISYMS.
3aade688 1057
896ca098 1058 SIZE is the size of a symbol in MINISYMS. */
252b5132
RH
1059
1060static void
896ca098
NC
1061print_symbols (bfd * abfd,
1062 bfd_boolean is_dynamic,
1063 void * minisyms,
1064 long symcount,
896ca098
NC
1065 unsigned int size,
1066 bfd * archive_bfd)
252b5132
RH
1067{
1068 asymbol *store;
896ca098
NC
1069 bfd_byte *from;
1070 bfd_byte *fromend;
252b5132
RH
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;
896ca098 1078
252b5132
RH
1079 for (; from < fromend; from += size)
1080 {
1081 asymbol *sym;
1082
91d6fa6a 1083 sym = bfd_minisymbol_to_symbol (abfd, is_dynamic, from, store);
252b5132
RH
1084 if (sym == NULL)
1085 bfd_fatal (bfd_get_filename (abfd));
1086
2387dd90 1087 print_symbol (abfd, sym, (bfd_vma) 0, archive_bfd);
252b5132
RH
1088 }
1089}
1090
382c1116 1091/* If ARCHIVE_BFD is non-NULL, it is the archive containing ABFD. */
252b5132 1092
0af11b59 1093static void
382c1116 1094display_rel_file (bfd *abfd, bfd *archive_bfd)
252b5132 1095{
382c1116
NC
1096 long symcount;
1097 void *minisyms;
1098 unsigned int size;
1099 struct size_sym *symsizes;
8dba52b6 1100 asymbol *synthsyms = NULL;
252b5132 1101
382c1116
NC
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)
bf26dcc6
NC
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 }
9993a355 1119
bf26dcc6
NC
1120 bfd_fatal (bfd_get_filename (abfd));
1121 }
252b5132 1122
382c1116 1123 if (symcount == 0)
252b5132 1124 {
382c1116
NC
1125 non_fatal (_("%s: no symbols"), bfd_get_filename (abfd));
1126 return;
1127 }
3aade688 1128
382c1116
NC
1129 if (show_synthetic && size == sizeof (asymbol *))
1130 {
382c1116
NC
1131 asymbol **static_syms = NULL;
1132 asymbol **dyn_syms = NULL;
1133 long static_count = 0;
1134 long dyn_count = 0;
2387dd90 1135 long synth_count;
252b5132 1136
382c1116
NC
1137 if (dynamic)
1138 {
1139 dyn_count = symcount;
3f5e193b 1140 dyn_syms = (asymbol **) minisyms;
382c1116 1141 }
977f7911 1142 else
382c1116 1143 {
8615f3f2
AM
1144 long storage = bfd_get_dynamic_symtab_upper_bound (abfd);
1145
382c1116 1146 static_count = symcount;
3f5e193b 1147 static_syms = (asymbol **) minisyms;
8615f3f2
AM
1148
1149 if (storage > 0)
1150 {
3f5e193b 1151 dyn_syms = (asymbol **) xmalloc (storage);
8615f3f2
AM
1152 dyn_count = bfd_canonicalize_dynamic_symtab (abfd, dyn_syms);
1153 if (dyn_count < 0)
1154 bfd_fatal (bfd_get_filename (abfd));
1155 }
382c1116 1156 }
896ca098 1157
382c1116
NC
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;
382c1116 1163 long i;
977f7911 1164
c2f5dc30
AM
1165 minisyms = xrealloc (minisyms,
1166 (symcount + synth_count + 1) * sizeof (*symp));
1167 symp = (asymbol **) minisyms + symcount;
382c1116
NC
1168 for (i = 0; i < synth_count; i++)
1169 *symp++ = synthsyms + i;
1170 *symp = 0;
382c1116
NC
1171 symcount += synth_count;
1172 }
252b5132 1173 }
252b5132 1174
cc5277b1
ML
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
382c1116
NC
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). */
252b5132 1187
382c1116 1188 symcount = filter_symbols (abfd, dynamic, minisyms, symcount, size);
2da42df6 1189
382c1116
NC
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));
252b5132 1199
382c1116
NC
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 }
252b5132 1207
382c1116 1208 if (! sort_by_size)
2387dd90 1209 print_symbols (abfd, dynamic, minisyms, symcount, size, archive_bfd);
252b5132 1210 else
2387dd90 1211 print_size_symbols (abfd, dynamic, symsizes, symcount, archive_bfd);
252b5132 1212
8dba52b6
L
1213 if (synthsyms)
1214 free (synthsyms);
382c1116 1215 free (minisyms);
497b9b32 1216 free (symsizes);
382c1116
NC
1217}
1218
970ccc77
NC
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
382c1116
NC
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 (;;)
252b5132 1252 {
382c1116 1253 PROGRESS (1);
252b5132 1254
382c1116
NC
1255 arfile = bfd_openr_next_archived_file (file, arfile);
1256
1257 if (arfile == NULL)
252b5132 1258 {
382c1116
NC
1259 if (bfd_get_error () != bfd_error_no_more_archived_files)
1260 bfd_fatal (bfd_get_filename (file));
1261 break;
252b5132 1262 }
382c1116
NC
1263
1264 if (bfd_check_format_matches (arfile, bfd_object, &matching))
252b5132 1265 {
970ccc77 1266 set_print_width (arfile);
382c1116
NC
1267 format->print_archive_member (bfd_get_filename (file),
1268 bfd_get_filename (arfile));
1269 display_rel_file (arfile, file);
252b5132 1270 }
382c1116 1271 else
252b5132 1272 {
382c1116
NC
1273 bfd_nonfatal (bfd_get_filename (arfile));
1274 if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
252b5132 1275 {
382c1116
NC
1276 list_matching_formats (matching);
1277 free (matching);
252b5132 1278 }
382c1116 1279 }
252b5132 1280
382c1116
NC
1281 if (last_arfile != NULL)
1282 {
1283 bfd_close (last_arfile);
1284 lineno_cache_bfd = NULL;
1285 lineno_cache_rel_bfd = NULL;
896ca098
NC
1286 if (arfile == last_arfile)
1287 return;
382c1116
NC
1288 }
1289 last_arfile = arfile;
1290 }
252b5132 1291
382c1116
NC
1292 if (last_arfile != NULL)
1293 {
1294 bfd_close (last_arfile);
1295 lineno_cache_bfd = NULL;
1296 lineno_cache_rel_bfd = NULL;
1297 }
1298}
252b5132 1299
382c1116
NC
1300static bfd_boolean
1301display_file (char *filename)
1302{
1303 bfd_boolean retval = TRUE;
1304 bfd *file;
1305 char **matching;
252b5132 1306
382c1116
NC
1307 if (get_file_size (filename) < 1)
1308 return FALSE;
252b5132 1309
a4b8af35 1310 file = bfd_openr (filename, target ? target : plugin_target);
382c1116
NC
1311 if (file == NULL)
1312 {
1313 bfd_nonfatal (filename);
1314 return FALSE;
1315 }
252b5132 1316
b76e66d3
CC
1317 /* If printing line numbers, decompress the debug sections. */
1318 if (line_numbers)
1319 file->flags |= BFD_DECOMPRESS;
1320
382c1116
NC
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 {
970ccc77 1327 set_print_width (file);
382c1116
NC
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)
252b5132 1335 {
382c1116
NC
1336 list_matching_formats (matching);
1337 free (matching);
252b5132 1338 }
382c1116 1339 retval = FALSE;
252b5132
RH
1340 }
1341
382c1116
NC
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;
252b5132
RH
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
b16c44de 1360print_object_filename_bsd (const char *filename)
252b5132
RH
1361{
1362 if (filename_per_file && !filename_per_symbol)
1363 printf ("\n%s:\n", filename);
1364}
1365
1366static void
b16c44de 1367print_object_filename_sysv (const char *filename)
252b5132
RH
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);
970ccc77 1373 if (print_width == 32)
33f5f537
L
1374 printf (_("\
1375Name Value Class Type Size Line Section\n\n"));
1376 else
1377 printf (_("\
1378Name Value Class Type Size Line Section\n\n"));
252b5132
RH
1379}
1380
1381static void
b16c44de 1382print_object_filename_posix (const char *filename)
252b5132
RH
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
b16c44de 1391print_archive_filename_bsd (const char *filename)
252b5132
RH
1392{
1393 if (filename_per_file)
1394 printf ("\n%s:\n", filename);
1395}
1396
1397static void
b16c44de 1398print_archive_filename_sysv (const char *filename ATTRIBUTE_UNUSED)
252b5132
RH
1399{
1400}
1401
1402static void
b16c44de 1403print_archive_filename_posix (const char *filename ATTRIBUTE_UNUSED)
252b5132
RH
1404{
1405}
1406\f
1407/* Print the name of an archive member file. */
1408
1409static void
b16c44de 1410print_archive_member_bsd (const char *archive ATTRIBUTE_UNUSED,
2da42df6 1411 const char *filename)
252b5132
RH
1412{
1413 if (!filename_per_symbol)
1414 printf ("\n%s:\n", filename);
1415}
1416
1417static void
b16c44de 1418print_archive_member_sysv (const char *archive, const char *filename)
252b5132
RH
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);
970ccc77 1424 if (print_width == 32)
33f5f537
L
1425 printf (_("\
1426Name Value Class Type Size Line Section\n\n"));
1427 else
1428 printf (_("\
1429Name Value Class Type Size Line Section\n\n"));
252b5132
RH
1430}
1431
1432static void
b16c44de 1433print_archive_member_posix (const char *archive, const char *filename)
252b5132
RH
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
2da42df6 1443print_symbol_filename_bsd (bfd *archive_bfd, bfd *abfd)
252b5132
RH
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
2da42df6 1454print_symbol_filename_sysv (bfd *archive_bfd, bfd *abfd)
252b5132
RH
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
2da42df6 1465print_symbol_filename_posix (bfd *archive_bfd, bfd *abfd)
252b5132
RH
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
25a02744
NC
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
252b5132
RH
1529/* Print a symbol value. */
1530
1531static void
2da42df6 1532print_value (bfd *abfd ATTRIBUTE_UNUSED, bfd_vma val)
252b5132 1533{
970ccc77 1534 switch (print_width)
252b5132 1535 {
970ccc77 1536 case 32:
25a02744 1537 printf (get_print_format (), (unsigned long) val);
970ccc77 1538 break;
252b5132 1539
970ccc77 1540 case 64:
39dbeff8 1541#if BFD_HOST_64BIT_LONG || BFD_HOST_64BIT_LONG_LONG
25a02744 1542 printf (get_print_format (), val);
970ccc77
NC
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
252b5132 1548 {
970ccc77
NC
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);
252b5132 1562 }
252b5132 1563#endif
970ccc77
NC
1564 break;
1565
1566 default:
1567 fatal (_("Print width has not been initialized (%d)"), print_width);
1568 break;
1569 }
252b5132
RH
1570}
1571
1572/* Print a line of information about a symbol. */
1573
1574static void
2da42df6 1575print_symbol_info_bsd (struct extended_symbol_info *info, bfd *abfd)
252b5132 1576{
977f7911 1577 if (bfd_is_undefined_symclass (SYM_TYPE (info)))
252b5132 1578 {
970ccc77 1579 if (print_width == 64)
62a5a82d 1580 printf (" ");
21211521 1581 printf (" ");
252b5132
RH
1582 }
1583 else
977f7911 1584 {
06a30c77 1585 /* Normally we print the value of the symbol. If we are printing the
50c2245b 1586 size or sorting by size then we print its size, except for the
06a30c77
NC
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));
72797995 1593 if (print_size && SYM_SIZE (info))
977f7911 1594 {
06a30c77 1595 printf (" ");
977f7911
NC
1596 print_value (abfd, SYM_SIZE (info));
1597 }
1598 }
1599
1600 printf (" %c", SYM_TYPE (info));
1601
1602 if (SYM_TYPE (info) == '-')
252b5132
RH
1603 {
1604 /* A stab. */
1605 printf (" ");
977f7911 1606 printf (other_format, SYM_STAB_OTHER (info));
252b5132 1607 printf (" ");
977f7911
NC
1608 printf (desc_format, SYM_STAB_DESC (info));
1609 printf (" %5s", SYM_STAB_NAME (info));
252b5132 1610 }
977f7911 1611 print_symname (" %s", SYM_NAME (info), abfd);
252b5132
RH
1612}
1613
1614static void
2da42df6 1615print_symbol_info_sysv (struct extended_symbol_info *info, bfd *abfd)
252b5132 1616{
977f7911
NC
1617 print_symname ("%-20s|", SYM_NAME (info), abfd);
1618
1619 if (bfd_is_undefined_symclass (SYM_TYPE (info)))
33f5f537 1620 {
970ccc77 1621 if (print_width == 32)
33f5f537
L
1622 printf (" ");
1623 else
1624 printf (" ");
1625 }
252b5132 1626 else
977f7911
NC
1627 print_value (abfd, SYM_VALUE (info));
1628
1629 printf ("| %c |", SYM_TYPE (info));
1630
1631 if (SYM_TYPE (info) == '-')
252b5132
RH
1632 {
1633 /* A stab. */
e3b83c8f
NC
1634 printf ("%18s| ", SYM_STAB_NAME (info)); /* (C) Type. */
1635 printf (desc_format, SYM_STAB_DESC (info)); /* Size. */
1636 printf ("| |"); /* Line, Section. */
252b5132
RH
1637 }
1638 else
9710509e 1639 {
977f7911 1640 /* Type, Size, Line, Section */
33f5f537
L
1641 if (info->elfinfo)
1642 printf ("%18s|",
552e55ed
JB
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));
33f5f537
L
1647 else
1648 printf (" |");
977f7911
NC
1649
1650 if (SYM_SIZE (info))
1651 print_value (abfd, SYM_SIZE (info));
1652 else
33f5f537 1653 {
970ccc77 1654 if (print_width == 32)
33f5f537
L
1655 printf (" ");
1656 else
1657 printf (" ");
1658 }
977f7911 1659
33f5f537
L
1660 if (info->elfinfo)
1661 printf("| |%s", info->elfinfo->symbol.section->name);
552e55ed
JB
1662 else if (info->coffinfo)
1663 printf("| |%s", info->coffinfo->symbol.section->name);
33f5f537
L
1664 else
1665 printf("| |");
977f7911 1666 }
252b5132
RH
1667}
1668
1669static void
2da42df6 1670print_symbol_info_posix (struct extended_symbol_info *info, bfd *abfd)
252b5132 1671{
977f7911
NC
1672 print_symname ("%s ", SYM_NAME (info), abfd);
1673 printf ("%c ", SYM_TYPE (info));
1674
1675 if (bfd_is_undefined_symclass (SYM_TYPE (info)))
252b5132
RH
1676 printf (" ");
1677 else
977f7911
NC
1678 {
1679 print_value (abfd, SYM_VALUE (info));
1680 printf (" ");
1681 if (SYM_SIZE (info))
1682 print_value (abfd, SYM_SIZE (info));
1683 }
252b5132
RH
1684}
1685\f
382c1116
NC
1686int
1687main (int argc, char **argv)
252b5132 1688{
382c1116
NC
1689 int c;
1690 int retval;
252b5132 1691
382c1116
NC
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);
86eafac0 1704 bfd_set_error_program_name (program_name);
fc579192
NC
1705#if BFD_SUPPORTS_PLUGINS
1706 bfd_plugin_set_program_name (program_name);
1707#endif
382c1116
NC
1708
1709 START_PROGRESS (program_name, 0);
1710
869b9d07
MM
1711 expandargv (&argc, &argv);
1712
bf2dd8d7
AM
1713 if (bfd_init () != BFD_INIT_MAGIC)
1714 fatal (_("fatal error: libbfd ABI mismatch"));
382c1116
NC
1715 set_default_bfd_target ();
1716
1717 while ((c = getopt_long (argc, argv, "aABCDef:gHhlnopPrSst:uvVvX:",
1718 long_options, (int *) 0)) != EOF)
252b5132 1719 {
382c1116 1720 switch (c)
252b5132 1721 {
382c1116
NC
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;
af03af8f
NC
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;
382c1116
NC
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':
ddb1377c 1772 no_sort = 0;
382c1116 1773 sort_numerically = 1;
ddb1377c 1774 sort_by_size = 0;
382c1116
NC
1775 break;
1776 case 'p':
1777 no_sort = 1;
ddb1377c
AM
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;
382c1116
NC
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
ce3c775b
NC
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
382c1116
NC
1831 case 0: /* A long option that just sets a flag. */
1832 break;
1833
1834 default:
1835 usage (stderr, 1);
252b5132
RH
1836 }
1837 }
252b5132 1838
382c1116
NC
1839 if (show_version)
1840 print_version ("nm");
252b5132 1841
382c1116 1842 if (sort_by_size && undefined_only)
252b5132 1843 {
382c1116
NC
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;
252b5132 1847 }
382c1116
NC
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)
252b5132 1860 {
382c1116
NC
1861 PROGRESS (1);
1862 if (!display_file (argv[optind++]))
1863 retval++;
1864 }
252b5132 1865
382c1116 1866 END_PROGRESS (program_name);
252b5132 1867
382c1116
NC
1868 exit (retval);
1869 return retval;
252b5132 1870}
This page took 0.972119 seconds and 4 git commands to generate.