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