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