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