[gdb/testsuite] Fix "unable to find usable gdb" error with cc-with-tweaks.exp
[deliverable/binutils-gdb.git] / binutils / nm.c
CommitLineData
252b5132 1/* nm.c -- Describe symbol table of a rel file.
82704155 2 Copyright (C) 1991-2019 Free Software Foundation, Inc.
252b5132
RH
3
4 This file is part of GNU Binutils.
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
32866df7 8 the Free Software Foundation; either version 3 of the License, or
252b5132
RH
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
b43b5d5f
NC
18 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
19 02110-1301, USA. */
252b5132 20
3db64b00 21#include "sysdep.h"
252b5132
RH
22#include "bfd.h"
23#include "progress.h"
252b5132
RH
24#include "getopt.h"
25#include "aout/stab_gnu.h"
26#include "aout/ranlib.h"
27#include "demangle.h"
28#include "libiberty.h"
6ab6b380 29#include "elf-bfd.h"
33f5f537 30#include "elf/common.h"
552e55ed
JB
31#define DO_NOT_DEFINE_AOUTHDR
32#define DO_NOT_DEFINE_FILHDR
33#define DO_NOT_DEFINE_LINENO
34#define DO_NOT_DEFINE_SCNHDR
35#include "coff/external.h"
36#include "coff/internal.h"
37#include "libcoff.h"
3db64b00 38#include "bucomm.h"
7d0b9ebc 39#include "plugin-api.h"
ce3c775b 40#include "plugin.h"
252b5132
RH
41
42/* When sorting by size, we use this structure to hold the size and a
43 pointer to the minisymbol. */
44
45struct size_sym
46{
2da42df6 47 const void *minisym;
252b5132
RH
48 bfd_vma size;
49};
50
51/* When fetching relocs, we use this structure to pass information to
52 get_relocs. */
53
54struct get_relocs_info
55{
56 asection **secs;
57 arelent ***relocs;
58 long *relcount;
59 asymbol **syms;
60};
61
9710509e 62struct extended_symbol_info
977f7911
NC
63{
64 symbol_info *sinfo;
65 bfd_vma ssize;
33f5f537 66 elf_symbol_type *elfinfo;
552e55ed 67 coff_symbol_type *coffinfo;
977f7911
NC
68 /* FIXME: We should add more fields for Type, Line, Section. */
69};
70#define SYM_NAME(sym) (sym->sinfo->name)
71#define SYM_VALUE(sym) (sym->sinfo->value)
72#define SYM_TYPE(sym) (sym->sinfo->type)
73#define SYM_STAB_NAME(sym) (sym->sinfo->stab_name)
74#define SYM_STAB_DESC(sym) (sym->sinfo->stab_desc)
75#define SYM_STAB_OTHER(sym) (sym->sinfo->stab_other)
33f5f537
L
76#define SYM_SIZE(sym) \
77 (sym->elfinfo ? sym->elfinfo->internal_elf_sym.st_size: sym->ssize)
977f7911 78
252b5132 79/* The output formatting functions. */
2da42df6
AJ
80static void print_object_filename_bsd (char *);
81static void print_object_filename_sysv (char *);
82static void print_object_filename_posix (char *);
83static void print_archive_filename_bsd (char *);
84static void print_archive_filename_sysv (char *);
85static void print_archive_filename_posix (char *);
86static void print_archive_member_bsd (char *, const char *);
87static void print_archive_member_sysv (char *, const char *);
88static void print_archive_member_posix (char *, const char *);
89static void print_symbol_filename_bsd (bfd *, bfd *);
90static void print_symbol_filename_sysv (bfd *, bfd *);
91static void print_symbol_filename_posix (bfd *, bfd *);
92static void print_value (bfd *, bfd_vma);
93static void print_symbol_info_bsd (struct extended_symbol_info *, bfd *);
94static void print_symbol_info_sysv (struct extended_symbol_info *, bfd *);
95static void print_symbol_info_posix (struct extended_symbol_info *, bfd *);
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. */
2da42df6 101 void (*print_object_filename) (char *);
252b5132
RH
102
103 /* Print the name of an archive file given on the command line. */
2da42df6 104 void (*print_archive_filename) (char *);
252b5132
RH
105
106 /* Print the name of an archive member file. */
2da42df6 107 void (*print_archive_member) (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];
144
252b5132
RH
145/* Command options. */
146
147static int do_demangle = 0; /* Pretty print C++ symbol names. */
977f7911
NC
148static int external_only = 0; /* Print external symbols only. */
149static int defined_only = 0; /* Print defined symbols only. */
150static int no_sort = 0; /* Don't sort; print syms in order found. */
151static int print_debug_syms = 0;/* Print debugger-only symbols too. */
152static int print_armap = 0; /* Describe __.SYMDEF data in archive files. */
72797995 153static int print_size = 0; /* Print size of defined symbols. */
977f7911
NC
154static int reverse_sort = 0; /* Sort in downward(alpha or numeric) order. */
155static int sort_numerically = 0;/* Sort in numeric rather than alpha order. */
156static int sort_by_size = 0; /* Sort by size of symbol. */
157static int undefined_only = 0; /* Print undefined symbols only. */
158static int dynamic = 0; /* Print dynamic symbols. */
159static int show_version = 0; /* Show the version number. */
0873df2a 160static int show_synthetic = 0; /* Display synthesized symbols too. */
977f7911 161static int line_numbers = 0; /* Print line numbers for symbols. */
3c9458e9 162static int allow_special_symbols = 0; /* Allow special symbols. */
df2c87b5 163static int with_symbol_versions = 0; /* Include symbol version information in the output. */
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
171/* Print formats for printing a symbol value. */
970ccc77 172static char value_format_32bit[] = "%08lx";
39dbeff8 173#if BFD_HOST_64BIT_LONG
970ccc77 174static char value_format_64bit[] = "%016lx";
39dbeff8 175#elif BFD_HOST_64BIT_LONG_LONG
a46d1146 176#ifndef __MSVCRT__
39dbeff8 177static char value_format_64bit[] = "%016llx";
a46d1146
JM
178#else
179static char value_format_64bit[] = "%016I64x";
180#endif
39dbeff8 181#endif
970ccc77 182static int print_width = 0;
252b5132
RH
183static int print_radix = 16;
184/* Print formats for printing stab info. */
185static char other_format[] = "%02x";
186static char desc_format[] = "%04x";
187
188static char *target = NULL;
92b1b678
MT
189#if BFD_SUPPORTS_PLUGINS
190static const char *plugin_target = "plugin";
191#else
192static const char *plugin_target = NULL;
193#endif
252b5132
RH
194
195/* Used to cache the line numbers for a BFD. */
196static bfd *lineno_cache_bfd;
197static bfd *lineno_cache_rel_bfd;
198
af03af8f
NC
199enum long_option_values
200{
201 OPTION_TARGET = 200,
202 OPTION_PLUGIN,
203 OPTION_SIZE_SORT,
204 OPTION_RECURSE_LIMIT,
205 OPTION_NO_RECURSE_LIMIT
206};
c20f4f8c 207
252b5132
RH
208static struct option long_options[] =
209{
210 {"debug-syms", no_argument, &print_debug_syms, 1},
28c309a2 211 {"demangle", optional_argument, 0, 'C'},
252b5132
RH
212 {"dynamic", no_argument, &dynamic, 1},
213 {"extern-only", no_argument, &external_only, 1},
214 {"format", required_argument, 0, 'f'},
215 {"help", no_argument, 0, 'h'},
216 {"line-numbers", no_argument, 0, 'l'},
217 {"no-cplus", no_argument, &do_demangle, 0}, /* Linux compatibility. */
218 {"no-demangle", no_argument, &do_demangle, 0},
af03af8f
NC
219 {"no-recurse-limit", no_argument, NULL, OPTION_NO_RECURSE_LIMIT},
220 {"no-recursion-limit", no_argument, NULL, OPTION_NO_RECURSE_LIMIT},
ddb1377c
AM
221 {"no-sort", no_argument, 0, 'p'},
222 {"numeric-sort", no_argument, 0, 'n'},
ce3c775b 223 {"plugin", required_argument, 0, OPTION_PLUGIN},
252b5132
RH
224 {"portability", no_argument, 0, 'P'},
225 {"print-armap", no_argument, &print_armap, 1},
226 {"print-file-name", no_argument, 0, 'o'},
72797995 227 {"print-size", no_argument, 0, 'S'},
252b5132 228 {"radix", required_argument, 0, 't'},
af03af8f
NC
229 {"recurse-limit", no_argument, NULL, OPTION_RECURSE_LIMIT},
230 {"recursion-limit", no_argument, NULL, OPTION_RECURSE_LIMIT},
252b5132 231 {"reverse-sort", no_argument, &reverse_sort, 1},
ddb1377c 232 {"size-sort", no_argument, 0, OPTION_SIZE_SORT},
3c9458e9 233 {"special-syms", no_argument, &allow_special_symbols, 1},
0873df2a 234 {"synthetic", no_argument, &show_synthetic, 1},
c20f4f8c 235 {"target", required_argument, 0, OPTION_TARGET},
252b5132
RH
236 {"defined-only", no_argument, &defined_only, 1},
237 {"undefined-only", no_argument, &undefined_only, 1},
238 {"version", no_argument, &show_version, 1},
df2c87b5 239 {"with-symbol-versions", no_argument, &with_symbol_versions, 1},
252b5132
RH
240 {0, no_argument, 0, 0}
241};
242\f
977f7911 243/* Some error-reporting functions. */
252b5132 244
1e0f0b4d 245ATTRIBUTE_NORETURN static void
2da42df6 246usage (FILE *stream, int status)
252b5132 247{
8b53311e
NC
248 fprintf (stream, _("Usage: %s [option(s)] [file(s)]\n"), program_name);
249 fprintf (stream, _(" List symbols in [file(s)] (a.out by default).\n"));
250 fprintf (stream, _(" The options are:\n\
b56f55ce
NC
251 -a, --debug-syms Display debugger-only symbols\n\
252 -A, --print-file-name Print name of the input file before every symbol\n\
253 -B Same as --format=bsd\n\
28c309a2
NC
254 -C, --demangle[=STYLE] Decode low-level symbol names into user-level names\n\
255 The STYLE, if specified, can be `auto' (the default),\n\
f0c8c24a
NC
256 `gnu', `lucid', `arm', `hp', `edg', `gnu-v3', `java'\n\
257 or `gnat'\n\
b56f55ce 258 --no-demangle Do not demangle low-level symbol names\n\
af03af8f
NC
259 --recurse-limit Enable a demangling recursion limit. This is the default.\n\
260 --no-recurse-limit Disable a demangling recursion limit.\n\
b56f55ce
NC
261 -D, --dynamic Display dynamic symbols instead of normal symbols\n\
262 --defined-only Display only defined symbols\n\
263 -e (ignored)\n\
264 -f, --format=FORMAT Use the output format FORMAT. FORMAT can be `bsd',\n\
265 `sysv' or `posix'. The default is `bsd'\n\
266 -g, --extern-only Display only external symbols\n\
b56f55ce
NC
267 -l, --line-numbers Use debugging information to find a filename and\n\
268 line number for each symbol\n\
269 -n, --numeric-sort Sort symbols numerically by address\n\
270 -o Same as -A\n\
271 -p, --no-sort Do not sort the symbols\n\
272 -P, --portability Same as --format=posix\n\
d46fc8e8 273 -r, --reverse-sort Reverse the sense of the sort\n"));
ce3c775b 274#if BFD_SUPPORTS_PLUGINS
d46fc8e8
NC
275 fprintf (stream, _("\
276 --plugin NAME Load the specified plugin\n"));
ce3c775b 277#endif
d46fc8e8 278 fprintf (stream, _("\
d2ca6b5b 279 -S, --print-size Print size of defined symbols\n\
b56f55ce
NC
280 -s, --print-armap Include index for symbols from archive members\n\
281 --size-sort Sort symbols by size\n\
61bbd35b 282 --special-syms Include special symbols in the output\n\
0873df2a 283 --synthetic Display synthetic symbols as well\n\
b56f55ce
NC
284 -t, --radix=RADIX Use RADIX for printing symbol values\n\
285 --target=BFDNAME Specify the target object format as BFDNAME\n\
286 -u, --undefined-only Display only undefined symbols\n\
df2c87b5 287 --with-symbol-versions Display version strings after symbol names\n\
6e800839 288 -X 32_64 (ignored)\n\
07012eee 289 @FILE Read options from FILE\n\
8b53311e
NC
290 -h, --help Display this information\n\
291 -V, --version Display this program's version number\n\
b56f55ce 292\n"));
252b5132 293 list_supported_targets (program_name, stream);
92f01d61 294 if (REPORT_BUGS_TO[0] && status == 0)
b56f55ce 295 fprintf (stream, _("Report bugs to %s.\n"), REPORT_BUGS_TO);
252b5132
RH
296 exit (status);
297}
298
299/* Set the radix for the symbol value and size according to RADIX. */
300
301static void
2da42df6 302set_print_radix (char *radix)
252b5132
RH
303{
304 switch (*radix)
305 {
306 case 'x':
307 break;
308 case 'd':
309 case 'o':
310 if (*radix == 'd')
311 print_radix = 10;
312 else
313 print_radix = 8;
970ccc77 314 value_format_32bit[4] = *radix;
39dbeff8 315#if BFD_HOST_64BIT_LONG
970ccc77 316 value_format_64bit[5] = *radix;
39dbeff8 317#elif BFD_HOST_64BIT_LONG_LONG
a46d1146 318#ifndef __MSVCRT__
39dbeff8 319 value_format_64bit[6] = *radix;
a46d1146
JM
320#else
321 value_format_64bit[7] = *radix;
322#endif
39dbeff8 323#endif
252b5132
RH
324 other_format[3] = desc_format[3] = *radix;
325 break;
326 default:
37cc8ec1 327 fatal (_("%s: invalid radix"), radix);
252b5132
RH
328 }
329}
330
331static void
2da42df6 332set_output_format (char *f)
252b5132
RH
333{
334 int i;
335
336 switch (*f)
337 {
338 case 'b':
339 case 'B':
340 i = FORMAT_BSD;
341 break;
342 case 'p':
343 case 'P':
344 i = FORMAT_POSIX;
345 break;
346 case 's':
347 case 'S':
348 i = FORMAT_SYSV;
349 break;
350 default:
37cc8ec1 351 fatal (_("%s: invalid output format"), f);
252b5132
RH
352 }
353 format = &formats[i];
354}
355\f
33f5f537 356static const char *
552e55ed 357get_elf_symbol_type (unsigned int type)
33f5f537 358{
7358f4cb
AM
359 static char *bufp;
360 int n;
33f5f537
L
361
362 switch (type)
363 {
364 case STT_NOTYPE: return "NOTYPE";
365 case STT_OBJECT: return "OBJECT";
366 case STT_FUNC: return "FUNC";
367 case STT_SECTION: return "SECTION";
368 case STT_FILE: return "FILE";
369 case STT_COMMON: return "COMMON";
370 case STT_TLS: return "TLS";
33f5f537 371 }
7358f4cb
AM
372
373 free (bufp);
374 if (type >= STT_LOPROC && type <= STT_HIPROC)
375 n = asprintf (&bufp, _("<processor specific>: %d"), type);
376 else if (type >= STT_LOOS && type <= STT_HIOS)
377 n = asprintf (&bufp, _("<OS specific>: %d"), type);
378 else
379 n = asprintf (&bufp, _("<unknown>: %d"), type);
380 if (n < 0)
381 fatal ("%s", xstrerror (errno));
382 return bufp;
33f5f537 383}
552e55ed
JB
384
385static const char *
386get_coff_symbol_type (const struct internal_syment *sym)
387{
7358f4cb
AM
388 static char *bufp;
389 int n;
552e55ed
JB
390
391 switch (sym->n_sclass)
392 {
393 case C_BLOCK: return "Block";
394 case C_FILE: return "File";
395 case C_LINE: return "Line";
396 }
397
398 if (!sym->n_type)
399 return "None";
7358f4cb 400
552e55ed
JB
401 switch (DTYPE(sym->n_type))
402 {
403 case DT_FCN: return "Function";
404 case DT_PTR: return "Pointer";
405 case DT_ARY: return "Array";
406 }
7358f4cb
AM
407
408 free (bufp);
409 n = asprintf (&bufp, _("<unknown>: %d/%d"), sym->n_sclass, sym->n_type);
410 if (n < 0)
411 fatal ("%s", xstrerror (errno));
412 return bufp;
552e55ed 413}
382c1116 414\f
91d6fa6a 415/* Print symbol name NAME, read from ABFD, with printf format FORM,
382c1116 416 demangling it if requested. */
33f5f537 417
252b5132 418static void
91d6fa6a 419print_symname (const char *form, const char *name, bfd *abfd)
252b5132 420{
382c1116 421 if (do_demangle && *name)
252b5132 422 {
af03af8f 423 char *res = bfd_demangle (abfd, name, demangle_flags);
ed180cc5
AM
424
425 if (res != NULL)
426 {
91d6fa6a 427 printf (form, res);
ed180cc5
AM
428 free (res);
429 return;
430 }
382c1116 431 }
252b5132 432
91d6fa6a 433 printf (form, name);
382c1116 434}
252b5132 435
382c1116
NC
436static void
437print_symdef_entry (bfd *abfd)
438{
439 symindex idx = BFD_NO_MORE_SYMBOLS;
440 carsym *thesym;
441 bfd_boolean everprinted = FALSE;
33f5f537 442
382c1116
NC
443 for (idx = bfd_get_next_mapent (abfd, idx, &thesym);
444 idx != BFD_NO_MORE_SYMBOLS;
445 idx = bfd_get_next_mapent (abfd, idx, &thesym))
446 {
447 bfd *elt;
448 if (!everprinted)
252b5132 449 {
382c1116
NC
450 printf (_("\nArchive index:\n"));
451 everprinted = TRUE;
252b5132 452 }
382c1116
NC
453 elt = bfd_get_elt_at_index (abfd, idx);
454 if (elt == NULL)
455 bfd_fatal ("bfd_get_elt_at_index");
456 if (thesym->name != (char *) NULL)
252b5132 457 {
382c1116
NC
458 print_symname ("%s", thesym->name, abfd);
459 printf (" in %s\n", bfd_get_filename (elt));
252b5132 460 }
252b5132
RH
461 }
462}
382c1116
NC
463\f
464/* Choose which symbol entries to print;
465 compact them downward to get rid of the rest.
466 Return the number of symbols to be printed. */
252b5132 467
382c1116 468static long
91d6fa6a 469filter_symbols (bfd *abfd, bfd_boolean is_dynamic, void *minisyms,
382c1116 470 long symcount, unsigned int size)
252b5132 471{
382c1116
NC
472 bfd_byte *from, *fromend, *to;
473 asymbol *store;
252b5132 474
382c1116
NC
475 store = bfd_make_empty_symbol (abfd);
476 if (store == NULL)
477 bfd_fatal (bfd_get_filename (abfd));
f24ddbdd 478
382c1116
NC
479 from = (bfd_byte *) minisyms;
480 fromend = from + symcount * size;
481 to = (bfd_byte *) minisyms;
252b5132 482
382c1116 483 for (; from < fromend; from += size)
252b5132 484 {
382c1116
NC
485 int keep = 0;
486 asymbol *sym;
33f5f537 487
382c1116
NC
488 PROGRESS (1);
489
91d6fa6a 490 sym = bfd_minisymbol_to_symbol (abfd, is_dynamic, (const void *) from, store);
382c1116
NC
491 if (sym == NULL)
492 bfd_fatal (bfd_get_filename (abfd));
493
e601d38b
AM
494 if (sym->name[0] == '_'
495 && sym->name[1] == '_'
496 && strcmp (sym->name + (sym->name[2] == '_'), "__gnu_lto_slim") == 0)
b794fc1d
AM
497 non_fatal (_("%s: plugin needed to handle lto object"),
498 bfd_get_filename (abfd));
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
610 xs = bfd_get_section (x);
611 ys = bfd_get_section (y);
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
663 xs = bfd_get_section (x);
664 ys = bfd_get_section (y);
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
792 sec = bfd_get_section (sym);
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
806 && sec == bfd_get_section (next))
807 sz = valueof (next) - valueof (sym);
808 else
809 sz = (bfd_get_section_vma (abfd, sec)
810 + bfd_section_size (abfd, sec)
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
df2c87b5
NC
905 if (with_symbol_versions)
906 {
907 const char * version_string = NULL;
908 bfd_boolean hidden = FALSE;
909
160b1a61 910 if ((sym->flags & (BSF_SECTION_SYM | BSF_SYNTHETIC)) == 0)
df2c87b5
NC
911 version_string = bfd_get_symbol_version_string (abfd, sym, &hidden);
912
913 if (bfd_is_und_section (bfd_get_section (sym)))
914 hidden = TRUE;
915
916 if (version_string && *version_string != '\0')
917 printf (hidden ? "@%s" : "@@%s", version_string);
918 }
919
382c1116 920 if (line_numbers)
0873df2a 921 {
382c1116
NC
922 static asymbol **syms;
923 static long symcount;
924 const char *filename, *functionname;
925 unsigned int lineno;
0873df2a 926
382c1116
NC
927 /* We need to get the canonical symbols in order to call
928 bfd_find_nearest_line. This is inefficient, but, then, you
929 don't have to use --line-numbers. */
930 if (abfd != lineno_cache_bfd && syms != NULL)
0873df2a 931 {
382c1116
NC
932 free (syms);
933 syms = NULL;
0873df2a 934 }
382c1116 935 if (syms == NULL)
0873df2a 936 {
382c1116
NC
937 long symsize;
938
939 symsize = bfd_get_symtab_upper_bound (abfd);
940 if (symsize < 0)
941 bfd_fatal (bfd_get_filename (abfd));
3f5e193b 942 syms = (asymbol **) xmalloc (symsize);
382c1116
NC
943 symcount = bfd_canonicalize_symtab (abfd, syms);
944 if (symcount < 0)
945 bfd_fatal (bfd_get_filename (abfd));
946 lineno_cache_bfd = abfd;
0873df2a 947 }
0873df2a 948
382c1116
NC
949 if (bfd_is_und_section (bfd_get_section (sym)))
950 {
951 static asection **secs;
952 static arelent ***relocs;
953 static long *relcount;
954 static unsigned int seccount;
955 unsigned int i;
956 const char *symname;
0873df2a 957
382c1116
NC
958 /* For an undefined symbol, we try to find a reloc for the
959 symbol, and print the line number of the reloc. */
960 if (abfd != lineno_cache_rel_bfd && relocs != NULL)
961 {
962 for (i = 0; i < seccount; i++)
963 if (relocs[i] != NULL)
964 free (relocs[i]);
965 free (secs);
966 free (relocs);
967 free (relcount);
968 secs = NULL;
969 relocs = NULL;
970 relcount = NULL;
971 }
252b5132 972
382c1116
NC
973 if (relocs == NULL)
974 {
91d6fa6a 975 struct get_relocs_info rinfo;
252b5132 976
382c1116 977 seccount = bfd_count_sections (abfd);
252b5132 978
3f5e193b
NC
979 secs = (asection **) xmalloc (seccount * sizeof *secs);
980 relocs = (arelent ***) xmalloc (seccount * sizeof *relocs);
981 relcount = (long *) xmalloc (seccount * sizeof *relcount);
252b5132 982
91d6fa6a
NC
983 rinfo.secs = secs;
984 rinfo.relocs = relocs;
985 rinfo.relcount = relcount;
986 rinfo.syms = syms;
987 bfd_map_over_sections (abfd, get_relocs, (void *) &rinfo);
382c1116
NC
988 lineno_cache_rel_bfd = abfd;
989 }
252b5132 990
382c1116
NC
991 symname = bfd_asymbol_name (sym);
992 for (i = 0; i < seccount; i++)
993 {
994 long j;
995
996 for (j = 0; j < relcount[i]; j++)
997 {
998 arelent *r;
999
1000 r = relocs[i][j];
1001 if (r->sym_ptr_ptr != NULL
1002 && (*r->sym_ptr_ptr)->section == sym->section
1003 && (*r->sym_ptr_ptr)->value == sym->value
1004 && strcmp (symname,
1005 bfd_asymbol_name (*r->sym_ptr_ptr)) == 0
1006 && bfd_find_nearest_line (abfd, secs[i], syms,
1007 r->address, &filename,
1008 &functionname, &lineno)
1009 && filename != NULL)
1010 {
1011 /* We only print the first one we find. */
1012 printf ("\t%s:%u", filename, lineno);
1013 i = seccount;
1014 break;
1015 }
1016 }
1017 }
1018 }
1019 else if (bfd_get_section (sym)->owner == abfd)
1020 {
5420f73d
L
1021 if ((bfd_find_line (abfd, syms, sym, &filename, &lineno)
1022 || bfd_find_nearest_line (abfd, bfd_get_section (sym),
1023 syms, sym->value, &filename,
1024 &functionname, &lineno))
382c1116
NC
1025 && filename != NULL
1026 && lineno != 0)
1027 printf ("\t%s:%u", filename, lineno);
1028 }
1029 }
1030
1031 putchar ('\n');
252b5132
RH
1032}
1033\f
382c1116 1034/* Print the symbols when sorting by size. */
252b5132 1035
382c1116 1036static void
896ca098
NC
1037print_size_symbols (bfd * abfd,
1038 bfd_boolean is_dynamic,
1039 struct size_sym * symsizes,
1040 long symcount,
896ca098 1041 bfd * archive_bfd)
252b5132 1042{
252b5132 1043 asymbol *store;
896ca098
NC
1044 struct size_sym *from;
1045 struct size_sym *fromend;
252b5132
RH
1046
1047 store = bfd_make_empty_symbol (abfd);
1048 if (store == NULL)
1049 bfd_fatal (bfd_get_filename (abfd));
1050
382c1116
NC
1051 from = symsizes;
1052 fromend = from + symcount;
896ca098 1053
382c1116 1054 for (; from < fromend; from++)
252b5132 1055 {
252b5132
RH
1056 asymbol *sym;
1057
91d6fa6a 1058 sym = bfd_minisymbol_to_symbol (abfd, is_dynamic, from->minisym, store);
252b5132
RH
1059 if (sym == NULL)
1060 bfd_fatal (bfd_get_filename (abfd));
1061
2387dd90 1062 print_symbol (abfd, sym, from->size, archive_bfd);
252b5132 1063 }
252b5132
RH
1064}
1065
382c1116 1066\f
896ca098
NC
1067/* Print the symbols of ABFD that are held in MINISYMS.
1068
1069 If ARCHIVE_BFD is non-NULL, it is the archive containing ABFD.
1070
2387dd90 1071 SYMCOUNT is the number of symbols in MINISYMS.
3aade688 1072
896ca098 1073 SIZE is the size of a symbol in MINISYMS. */
252b5132
RH
1074
1075static void
896ca098
NC
1076print_symbols (bfd * abfd,
1077 bfd_boolean is_dynamic,
1078 void * minisyms,
1079 long symcount,
896ca098
NC
1080 unsigned int size,
1081 bfd * archive_bfd)
252b5132
RH
1082{
1083 asymbol *store;
896ca098
NC
1084 bfd_byte *from;
1085 bfd_byte *fromend;
252b5132
RH
1086
1087 store = bfd_make_empty_symbol (abfd);
1088 if (store == NULL)
1089 bfd_fatal (bfd_get_filename (abfd));
1090
1091 from = (bfd_byte *) minisyms;
1092 fromend = from + symcount * size;
896ca098 1093
252b5132
RH
1094 for (; from < fromend; from += size)
1095 {
1096 asymbol *sym;
1097
91d6fa6a 1098 sym = bfd_minisymbol_to_symbol (abfd, is_dynamic, from, store);
252b5132
RH
1099 if (sym == NULL)
1100 bfd_fatal (bfd_get_filename (abfd));
1101
2387dd90 1102 print_symbol (abfd, sym, (bfd_vma) 0, archive_bfd);
252b5132
RH
1103 }
1104}
1105
382c1116 1106/* If ARCHIVE_BFD is non-NULL, it is the archive containing ABFD. */
252b5132 1107
0af11b59 1108static void
382c1116 1109display_rel_file (bfd *abfd, bfd *archive_bfd)
252b5132 1110{
382c1116
NC
1111 long symcount;
1112 void *minisyms;
1113 unsigned int size;
1114 struct size_sym *symsizes;
8dba52b6 1115 asymbol *synthsyms = NULL;
252b5132 1116
382c1116
NC
1117 if (! dynamic)
1118 {
1119 if (!(bfd_get_file_flags (abfd) & HAS_SYMS))
1120 {
1121 non_fatal (_("%s: no symbols"), bfd_get_filename (abfd));
1122 return;
1123 }
1124 }
1125
1126 symcount = bfd_read_minisymbols (abfd, dynamic, &minisyms, &size);
1127 if (symcount < 0)
bf26dcc6
NC
1128 {
1129 if (dynamic && bfd_get_error () == bfd_error_no_symbols)
1130 {
1131 non_fatal (_("%s: no symbols"), bfd_get_filename (abfd));
1132 return;
1133 }
9993a355 1134
bf26dcc6
NC
1135 bfd_fatal (bfd_get_filename (abfd));
1136 }
252b5132 1137
382c1116 1138 if (symcount == 0)
252b5132 1139 {
382c1116
NC
1140 non_fatal (_("%s: no symbols"), bfd_get_filename (abfd));
1141 return;
1142 }
3aade688 1143
382c1116
NC
1144 if (show_synthetic && size == sizeof (asymbol *))
1145 {
382c1116
NC
1146 asymbol **static_syms = NULL;
1147 asymbol **dyn_syms = NULL;
1148 long static_count = 0;
1149 long dyn_count = 0;
2387dd90 1150 long synth_count;
252b5132 1151
382c1116
NC
1152 if (dynamic)
1153 {
1154 dyn_count = symcount;
3f5e193b 1155 dyn_syms = (asymbol **) minisyms;
382c1116 1156 }
977f7911 1157 else
382c1116 1158 {
8615f3f2
AM
1159 long storage = bfd_get_dynamic_symtab_upper_bound (abfd);
1160
382c1116 1161 static_count = symcount;
3f5e193b 1162 static_syms = (asymbol **) minisyms;
8615f3f2
AM
1163
1164 if (storage > 0)
1165 {
3f5e193b 1166 dyn_syms = (asymbol **) xmalloc (storage);
8615f3f2
AM
1167 dyn_count = bfd_canonicalize_dynamic_symtab (abfd, dyn_syms);
1168 if (dyn_count < 0)
1169 bfd_fatal (bfd_get_filename (abfd));
1170 }
382c1116 1171 }
896ca098 1172
382c1116
NC
1173 synth_count = bfd_get_synthetic_symtab (abfd, static_count, static_syms,
1174 dyn_count, dyn_syms, &synthsyms);
1175 if (synth_count > 0)
1176 {
1177 asymbol **symp;
382c1116 1178 long i;
977f7911 1179
c2f5dc30
AM
1180 minisyms = xrealloc (minisyms,
1181 (symcount + synth_count + 1) * sizeof (*symp));
1182 symp = (asymbol **) minisyms + symcount;
382c1116
NC
1183 for (i = 0; i < synth_count; i++)
1184 *symp++ = synthsyms + i;
1185 *symp = 0;
382c1116
NC
1186 symcount += synth_count;
1187 }
252b5132 1188 }
252b5132 1189
382c1116
NC
1190 /* Discard the symbols we don't want to print.
1191 It's OK to do this in place; we'll free the storage anyway
1192 (after printing). */
252b5132 1193
382c1116 1194 symcount = filter_symbols (abfd, dynamic, minisyms, symcount, size);
2da42df6 1195
382c1116
NC
1196 symsizes = NULL;
1197 if (! no_sort)
1198 {
1199 sort_bfd = abfd;
1200 sort_dynamic = dynamic;
1201 sort_x = bfd_make_empty_symbol (abfd);
1202 sort_y = bfd_make_empty_symbol (abfd);
1203 if (sort_x == NULL || sort_y == NULL)
1204 bfd_fatal (bfd_get_filename (abfd));
252b5132 1205
382c1116
NC
1206 if (! sort_by_size)
1207 qsort (minisyms, symcount, size,
1208 sorters[sort_numerically][reverse_sort]);
1209 else
1210 symcount = sort_symbols_by_size (abfd, dynamic, minisyms, symcount,
1211 size, &symsizes);
1212 }
252b5132 1213
382c1116 1214 if (! sort_by_size)
2387dd90 1215 print_symbols (abfd, dynamic, minisyms, symcount, size, archive_bfd);
252b5132 1216 else
2387dd90 1217 print_size_symbols (abfd, dynamic, symsizes, symcount, archive_bfd);
252b5132 1218
8dba52b6
L
1219 if (synthsyms)
1220 free (synthsyms);
382c1116 1221 free (minisyms);
497b9b32 1222 free (symsizes);
382c1116
NC
1223}
1224
970ccc77
NC
1225static void
1226set_print_width (bfd *file)
1227{
1228 print_width = bfd_get_arch_size (file);
1229
1230 if (print_width == -1)
1231 {
1232 /* PR binutils/4292
1233 Guess the target's bitsize based on its name.
1234 We assume here than any 64-bit format will include
1235 "64" somewhere in its name. The only known exception
1236 is the MMO object file format. */
1237 if (strstr (bfd_get_target (file), "64") != NULL
1238 || strcmp (bfd_get_target (file), "mmo") == 0)
1239 print_width = 64;
1240 else
1241 print_width = 32;
1242 }
1243}
1244
382c1116
NC
1245static void
1246display_archive (bfd *file)
1247{
1248 bfd *arfile = NULL;
1249 bfd *last_arfile = NULL;
1250 char **matching;
1251
1252 format->print_archive_filename (bfd_get_filename (file));
1253
1254 if (print_armap)
1255 print_symdef_entry (file);
1256
1257 for (;;)
252b5132 1258 {
382c1116 1259 PROGRESS (1);
252b5132 1260
382c1116
NC
1261 arfile = bfd_openr_next_archived_file (file, arfile);
1262
1263 if (arfile == NULL)
252b5132 1264 {
382c1116
NC
1265 if (bfd_get_error () != bfd_error_no_more_archived_files)
1266 bfd_fatal (bfd_get_filename (file));
1267 break;
252b5132 1268 }
382c1116
NC
1269
1270 if (bfd_check_format_matches (arfile, bfd_object, &matching))
252b5132 1271 {
970ccc77 1272 set_print_width (arfile);
382c1116
NC
1273 format->print_archive_member (bfd_get_filename (file),
1274 bfd_get_filename (arfile));
1275 display_rel_file (arfile, file);
252b5132 1276 }
382c1116 1277 else
252b5132 1278 {
382c1116
NC
1279 bfd_nonfatal (bfd_get_filename (arfile));
1280 if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
252b5132 1281 {
382c1116
NC
1282 list_matching_formats (matching);
1283 free (matching);
252b5132 1284 }
382c1116 1285 }
252b5132 1286
382c1116
NC
1287 if (last_arfile != NULL)
1288 {
1289 bfd_close (last_arfile);
1290 lineno_cache_bfd = NULL;
1291 lineno_cache_rel_bfd = NULL;
896ca098
NC
1292 if (arfile == last_arfile)
1293 return;
382c1116
NC
1294 }
1295 last_arfile = arfile;
1296 }
252b5132 1297
382c1116
NC
1298 if (last_arfile != NULL)
1299 {
1300 bfd_close (last_arfile);
1301 lineno_cache_bfd = NULL;
1302 lineno_cache_rel_bfd = NULL;
1303 }
1304}
252b5132 1305
382c1116
NC
1306static bfd_boolean
1307display_file (char *filename)
1308{
1309 bfd_boolean retval = TRUE;
1310 bfd *file;
1311 char **matching;
252b5132 1312
382c1116
NC
1313 if (get_file_size (filename) < 1)
1314 return FALSE;
252b5132 1315
a4b8af35 1316 file = bfd_openr (filename, target ? target : plugin_target);
382c1116
NC
1317 if (file == NULL)
1318 {
1319 bfd_nonfatal (filename);
1320 return FALSE;
1321 }
252b5132 1322
b76e66d3
CC
1323 /* If printing line numbers, decompress the debug sections. */
1324 if (line_numbers)
1325 file->flags |= BFD_DECOMPRESS;
1326
382c1116
NC
1327 if (bfd_check_format (file, bfd_archive))
1328 {
1329 display_archive (file);
1330 }
1331 else if (bfd_check_format_matches (file, bfd_object, &matching))
1332 {
970ccc77 1333 set_print_width (file);
382c1116
NC
1334 format->print_object_filename (filename);
1335 display_rel_file (file, NULL);
1336 }
1337 else
1338 {
1339 bfd_nonfatal (filename);
1340 if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
252b5132 1341 {
382c1116
NC
1342 list_matching_formats (matching);
1343 free (matching);
252b5132 1344 }
382c1116 1345 retval = FALSE;
252b5132
RH
1346 }
1347
382c1116
NC
1348 if (!bfd_close (file))
1349 bfd_fatal (filename);
1350
1351 lineno_cache_bfd = NULL;
1352 lineno_cache_rel_bfd = NULL;
1353
1354 return retval;
252b5132
RH
1355}
1356\f
1357/* The following 3 groups of functions are called unconditionally,
1358 once at the start of processing each file of the appropriate type.
1359 They should check `filename_per_file' and `filename_per_symbol',
1360 as appropriate for their output format, to determine whether to
1361 print anything. */
1362\f
1363/* Print the name of an object file given on the command line. */
1364
1365static void
2da42df6 1366print_object_filename_bsd (char *filename)
252b5132
RH
1367{
1368 if (filename_per_file && !filename_per_symbol)
1369 printf ("\n%s:\n", filename);
1370}
1371
1372static void
2da42df6 1373print_object_filename_sysv (char *filename)
252b5132
RH
1374{
1375 if (undefined_only)
1376 printf (_("\n\nUndefined symbols from %s:\n\n"), filename);
1377 else
1378 printf (_("\n\nSymbols from %s:\n\n"), filename);
970ccc77 1379 if (print_width == 32)
33f5f537
L
1380 printf (_("\
1381Name Value Class Type Size Line Section\n\n"));
1382 else
1383 printf (_("\
1384Name Value Class Type Size Line Section\n\n"));
252b5132
RH
1385}
1386
1387static void
2da42df6 1388print_object_filename_posix (char *filename)
252b5132
RH
1389{
1390 if (filename_per_file && !filename_per_symbol)
1391 printf ("%s:\n", filename);
1392}
1393\f
1394/* Print the name of an archive file given on the command line. */
1395
1396static void
2da42df6 1397print_archive_filename_bsd (char *filename)
252b5132
RH
1398{
1399 if (filename_per_file)
1400 printf ("\n%s:\n", filename);
1401}
1402
1403static void
2da42df6 1404print_archive_filename_sysv (char *filename ATTRIBUTE_UNUSED)
252b5132
RH
1405{
1406}
1407
1408static void
2da42df6 1409print_archive_filename_posix (char *filename ATTRIBUTE_UNUSED)
252b5132
RH
1410{
1411}
1412\f
1413/* Print the name of an archive member file. */
1414
1415static void
2da42df6
AJ
1416print_archive_member_bsd (char *archive ATTRIBUTE_UNUSED,
1417 const char *filename)
252b5132
RH
1418{
1419 if (!filename_per_symbol)
1420 printf ("\n%s:\n", filename);
1421}
1422
1423static void
2da42df6 1424print_archive_member_sysv (char *archive, const char *filename)
252b5132
RH
1425{
1426 if (undefined_only)
1427 printf (_("\n\nUndefined symbols from %s[%s]:\n\n"), archive, filename);
1428 else
1429 printf (_("\n\nSymbols from %s[%s]:\n\n"), archive, filename);
970ccc77 1430 if (print_width == 32)
33f5f537
L
1431 printf (_("\
1432Name Value Class Type Size Line Section\n\n"));
1433 else
1434 printf (_("\
1435Name Value Class Type Size Line Section\n\n"));
252b5132
RH
1436}
1437
1438static void
2da42df6 1439print_archive_member_posix (char *archive, const char *filename)
252b5132
RH
1440{
1441 if (!filename_per_symbol)
1442 printf ("%s[%s]:\n", archive, filename);
1443}
1444\f
1445/* Print the name of the file (and archive, if there is one)
1446 containing a symbol. */
1447
1448static void
2da42df6 1449print_symbol_filename_bsd (bfd *archive_bfd, bfd *abfd)
252b5132
RH
1450{
1451 if (filename_per_symbol)
1452 {
1453 if (archive_bfd)
1454 printf ("%s:", bfd_get_filename (archive_bfd));
1455 printf ("%s:", bfd_get_filename (abfd));
1456 }
1457}
1458
1459static void
2da42df6 1460print_symbol_filename_sysv (bfd *archive_bfd, bfd *abfd)
252b5132
RH
1461{
1462 if (filename_per_symbol)
1463 {
1464 if (archive_bfd)
1465 printf ("%s:", bfd_get_filename (archive_bfd));
1466 printf ("%s:", bfd_get_filename (abfd));
1467 }
1468}
1469
1470static void
2da42df6 1471print_symbol_filename_posix (bfd *archive_bfd, bfd *abfd)
252b5132
RH
1472{
1473 if (filename_per_symbol)
1474 {
1475 if (archive_bfd)
1476 printf ("%s[%s]: ", bfd_get_filename (archive_bfd),
1477 bfd_get_filename (abfd));
1478 else
1479 printf ("%s: ", bfd_get_filename (abfd));
1480 }
1481}
1482\f
1483/* Print a symbol value. */
1484
1485static void
2da42df6 1486print_value (bfd *abfd ATTRIBUTE_UNUSED, bfd_vma val)
252b5132 1487{
970ccc77 1488 switch (print_width)
252b5132 1489 {
970ccc77 1490 case 32:
be26064b 1491 printf (value_format_32bit, (unsigned long) val);
970ccc77 1492 break;
252b5132 1493
970ccc77 1494 case 64:
39dbeff8 1495#if BFD_HOST_64BIT_LONG || BFD_HOST_64BIT_LONG_LONG
970ccc77
NC
1496 printf (value_format_64bit, val);
1497#else
1498 /* We have a 64 bit value to print, but the host is only 32 bit. */
1499 if (print_radix == 16)
1500 bfd_fprintf_vma (abfd, stdout, val);
1501 else
252b5132 1502 {
970ccc77
NC
1503 char buf[30];
1504 char *s;
1505
1506 s = buf + sizeof buf;
1507 *--s = '\0';
1508 while (val > 0)
1509 {
1510 *--s = (val % print_radix) + '0';
1511 val /= print_radix;
1512 }
1513 while ((buf + sizeof buf - 1) - s < 16)
1514 *--s = '0';
1515 printf ("%s", s);
252b5132 1516 }
252b5132 1517#endif
970ccc77
NC
1518 break;
1519
1520 default:
1521 fatal (_("Print width has not been initialized (%d)"), print_width);
1522 break;
1523 }
252b5132
RH
1524}
1525
1526/* Print a line of information about a symbol. */
1527
1528static void
2da42df6 1529print_symbol_info_bsd (struct extended_symbol_info *info, bfd *abfd)
252b5132 1530{
977f7911 1531 if (bfd_is_undefined_symclass (SYM_TYPE (info)))
252b5132 1532 {
970ccc77 1533 if (print_width == 64)
62a5a82d 1534 printf (" ");
21211521 1535 printf (" ");
252b5132
RH
1536 }
1537 else
977f7911 1538 {
06a30c77 1539 /* Normally we print the value of the symbol. If we are printing the
50c2245b 1540 size or sorting by size then we print its size, except for the
06a30c77
NC
1541 (weird) special case where both flags are defined, in which case we
1542 print both values. This conforms to documented behaviour. */
1543 if (sort_by_size && !print_size)
1544 print_value (abfd, SYM_SIZE (info));
1545 else
1546 print_value (abfd, SYM_VALUE (info));
72797995 1547 if (print_size && SYM_SIZE (info))
977f7911 1548 {
06a30c77 1549 printf (" ");
977f7911
NC
1550 print_value (abfd, SYM_SIZE (info));
1551 }
1552 }
1553
1554 printf (" %c", SYM_TYPE (info));
1555
1556 if (SYM_TYPE (info) == '-')
252b5132
RH
1557 {
1558 /* A stab. */
1559 printf (" ");
977f7911 1560 printf (other_format, SYM_STAB_OTHER (info));
252b5132 1561 printf (" ");
977f7911
NC
1562 printf (desc_format, SYM_STAB_DESC (info));
1563 printf (" %5s", SYM_STAB_NAME (info));
252b5132 1564 }
977f7911 1565 print_symname (" %s", SYM_NAME (info), abfd);
252b5132
RH
1566}
1567
1568static void
2da42df6 1569print_symbol_info_sysv (struct extended_symbol_info *info, bfd *abfd)
252b5132 1570{
977f7911
NC
1571 print_symname ("%-20s|", SYM_NAME (info), abfd);
1572
1573 if (bfd_is_undefined_symclass (SYM_TYPE (info)))
33f5f537 1574 {
970ccc77 1575 if (print_width == 32)
33f5f537
L
1576 printf (" ");
1577 else
1578 printf (" ");
1579 }
252b5132 1580 else
977f7911
NC
1581 print_value (abfd, SYM_VALUE (info));
1582
1583 printf ("| %c |", SYM_TYPE (info));
1584
1585 if (SYM_TYPE (info) == '-')
252b5132
RH
1586 {
1587 /* A stab. */
e3b83c8f
NC
1588 printf ("%18s| ", SYM_STAB_NAME (info)); /* (C) Type. */
1589 printf (desc_format, SYM_STAB_DESC (info)); /* Size. */
1590 printf ("| |"); /* Line, Section. */
252b5132
RH
1591 }
1592 else
9710509e 1593 {
977f7911 1594 /* Type, Size, Line, Section */
33f5f537
L
1595 if (info->elfinfo)
1596 printf ("%18s|",
552e55ed
JB
1597 get_elf_symbol_type (ELF_ST_TYPE (info->elfinfo->internal_elf_sym.st_info)));
1598 else if (info->coffinfo)
1599 printf ("%18s|",
1600 get_coff_symbol_type (&info->coffinfo->native->u.syment));
33f5f537
L
1601 else
1602 printf (" |");
977f7911
NC
1603
1604 if (SYM_SIZE (info))
1605 print_value (abfd, SYM_SIZE (info));
1606 else
33f5f537 1607 {
970ccc77 1608 if (print_width == 32)
33f5f537
L
1609 printf (" ");
1610 else
1611 printf (" ");
1612 }
977f7911 1613
33f5f537
L
1614 if (info->elfinfo)
1615 printf("| |%s", info->elfinfo->symbol.section->name);
552e55ed
JB
1616 else if (info->coffinfo)
1617 printf("| |%s", info->coffinfo->symbol.section->name);
33f5f537
L
1618 else
1619 printf("| |");
977f7911 1620 }
252b5132
RH
1621}
1622
1623static void
2da42df6 1624print_symbol_info_posix (struct extended_symbol_info *info, bfd *abfd)
252b5132 1625{
977f7911
NC
1626 print_symname ("%s ", SYM_NAME (info), abfd);
1627 printf ("%c ", SYM_TYPE (info));
1628
1629 if (bfd_is_undefined_symclass (SYM_TYPE (info)))
252b5132
RH
1630 printf (" ");
1631 else
977f7911
NC
1632 {
1633 print_value (abfd, SYM_VALUE (info));
1634 printf (" ");
1635 if (SYM_SIZE (info))
1636 print_value (abfd, SYM_SIZE (info));
1637 }
252b5132
RH
1638}
1639\f
382c1116
NC
1640int
1641main (int argc, char **argv)
252b5132 1642{
382c1116
NC
1643 int c;
1644 int retval;
252b5132 1645
382c1116
NC
1646#if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
1647 setlocale (LC_MESSAGES, "");
1648#endif
1649#if defined (HAVE_SETLOCALE)
1650 setlocale (LC_CTYPE, "");
1651 setlocale (LC_COLLATE, "");
1652#endif
1653 bindtextdomain (PACKAGE, LOCALEDIR);
1654 textdomain (PACKAGE);
1655
1656 program_name = *argv;
1657 xmalloc_set_program_name (program_name);
86eafac0 1658 bfd_set_error_program_name (program_name);
fc579192
NC
1659#if BFD_SUPPORTS_PLUGINS
1660 bfd_plugin_set_program_name (program_name);
1661#endif
382c1116
NC
1662
1663 START_PROGRESS (program_name, 0);
1664
869b9d07
MM
1665 expandargv (&argc, &argv);
1666
bf2dd8d7
AM
1667 if (bfd_init () != BFD_INIT_MAGIC)
1668 fatal (_("fatal error: libbfd ABI mismatch"));
382c1116
NC
1669 set_default_bfd_target ();
1670
1671 while ((c = getopt_long (argc, argv, "aABCDef:gHhlnopPrSst:uvVvX:",
1672 long_options, (int *) 0)) != EOF)
252b5132 1673 {
382c1116 1674 switch (c)
252b5132 1675 {
382c1116
NC
1676 case 'a':
1677 print_debug_syms = 1;
1678 break;
1679 case 'A':
1680 case 'o':
1681 filename_per_symbol = 1;
1682 break;
1683 case 'B': /* For MIPS compatibility. */
1684 set_output_format ("bsd");
1685 break;
1686 case 'C':
1687 do_demangle = 1;
1688 if (optarg != NULL)
1689 {
1690 enum demangling_styles style;
1691
1692 style = cplus_demangle_name_to_style (optarg);
1693 if (style == unknown_demangling)
1694 fatal (_("unknown demangling style `%s'"),
1695 optarg);
1696
1697 cplus_demangle_set_style (style);
1698 }
1699 break;
af03af8f
NC
1700 case OPTION_RECURSE_LIMIT:
1701 demangle_flags &= ~ DMGL_NO_RECURSE_LIMIT;
1702 break;
1703 case OPTION_NO_RECURSE_LIMIT:
1704 demangle_flags |= DMGL_NO_RECURSE_LIMIT;
1705 break;
382c1116
NC
1706 case 'D':
1707 dynamic = 1;
1708 break;
1709 case 'e':
1710 /* Ignored for HP/UX compatibility. */
1711 break;
1712 case 'f':
1713 set_output_format (optarg);
1714 break;
1715 case 'g':
1716 external_only = 1;
1717 break;
1718 case 'H':
1719 case 'h':
1720 usage (stdout, 0);
1721 case 'l':
1722 line_numbers = 1;
1723 break;
1724 case 'n':
1725 case 'v':
ddb1377c 1726 no_sort = 0;
382c1116 1727 sort_numerically = 1;
ddb1377c 1728 sort_by_size = 0;
382c1116
NC
1729 break;
1730 case 'p':
1731 no_sort = 1;
ddb1377c
AM
1732 sort_numerically = 0;
1733 sort_by_size = 0;
1734 break;
1735 case OPTION_SIZE_SORT:
1736 no_sort = 0;
1737 sort_numerically = 0;
1738 sort_by_size = 1;
382c1116
NC
1739 break;
1740 case 'P':
1741 set_output_format ("posix");
1742 break;
1743 case 'r':
1744 reverse_sort = 1;
1745 break;
1746 case 's':
1747 print_armap = 1;
1748 break;
1749 case 'S':
1750 print_size = 1;
1751 break;
1752 case 't':
1753 set_print_radix (optarg);
1754 break;
1755 case 'u':
1756 undefined_only = 1;
1757 break;
1758 case 'V':
1759 show_version = 1;
1760 break;
1761 case 'X':
1762 /* Ignored for (partial) AIX compatibility. On AIX, the
1763 argument has values 32, 64, or 32_64, and specifies that
1764 only 32-bit, only 64-bit, or both kinds of objects should
1765 be examined. The default is 32. So plain AIX nm on a
1766 library archive with both kinds of objects will ignore
1767 the 64-bit ones. For GNU nm, the default is and always
1768 has been -X 32_64, and other options are not supported. */
1769 if (strcmp (optarg, "32_64") != 0)
1770 fatal (_("Only -X 32_64 is supported"));
1771 break;
1772
1773 case OPTION_TARGET: /* --target */
1774 target = optarg;
1775 break;
1776
ce3c775b
NC
1777 case OPTION_PLUGIN: /* --plugin */
1778#if BFD_SUPPORTS_PLUGINS
1779 bfd_plugin_set_plugin (optarg);
1780#else
1781 fatal (_("sorry - this program has been built without plugin support\n"));
1782#endif
1783 break;
1784
382c1116
NC
1785 case 0: /* A long option that just sets a flag. */
1786 break;
1787
1788 default:
1789 usage (stderr, 1);
252b5132
RH
1790 }
1791 }
252b5132 1792
382c1116
NC
1793 if (show_version)
1794 print_version ("nm");
252b5132 1795
382c1116 1796 if (sort_by_size && undefined_only)
252b5132 1797 {
382c1116
NC
1798 non_fatal (_("Using the --size-sort and --undefined-only options together"));
1799 non_fatal (_("will produce no output, since undefined symbols have no size."));
1800 return 0;
252b5132 1801 }
382c1116
NC
1802
1803 /* OK, all options now parsed. If no filename specified, do a.out. */
1804 if (optind == argc)
1805 return !display_file ("a.out");
1806
1807 retval = 0;
1808
1809 if (argc - optind > 1)
1810 filename_per_file = 1;
1811
1812 /* We were given several filenames to do. */
1813 while (optind < argc)
252b5132 1814 {
382c1116
NC
1815 PROGRESS (1);
1816 if (!display_file (argv[optind++]))
1817 retval++;
1818 }
252b5132 1819
382c1116 1820 END_PROGRESS (program_name);
252b5132 1821
382c1116
NC
1822 exit (retval);
1823 return retval;
252b5132 1824}
This page took 0.858001 seconds and 4 git commands to generate.