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